Wie man virtuelle Apache-Hosts unter Ubuntu mit Terraform konfiguriert

Um mehrere Websites zu hosten, greifen Administratoren häufig auf die Technik des „virtuellen Hostings“ zurück. Beim virtuellen Hosting werden mehrere Websites auf einem einzigen Rechner gehostet. Dies kann entweder durch eine „IP-basierte“ Methode oder durch einen „namensbasierten“ Ansatz erreicht werden. Beim „IP-basierten“ Hosting haben wir für jede Website eine eigene IP-Adresse. Beim „namensbasierten“ Hosting haben wir mehrere Namen, die auf jeder IP-Adresse laufen.

Es gibt heute viele Tools zur Automatisierung von Cloud-basierten Infrastrukturen. Terraform ist eines dieser Tools, das in letzter Zeit in der DevOps-Welt enorm an Popularität gewonnen hat. Terraform ist ein Open-Source-Tool, das von HashiCorp entwickelt und gepflegt wird. Es verwendet seine eigene Hashicorp Configuration Language (HCL), um mehrere Cloud-Service-Anbieter bereitzustellen. Im Grunde vergleicht Terraform deine aktuelle Infrastrukturkonfiguration mit dem gewünschten Zustand und ändert nur die Teile der Infrastruktur, die erforderlich sind, um den gewünschten Zustand zu erreichen.

Was werden wir behandeln?

In diesem Lernprogramm werden wir sehen, wie wir mit Terraform zwei virtuelle Hosts auf einem Ubuntu 22.04 System hosten können. Wir werden den Apache-Webserver verwenden, um diese Übung durchzuführen.

Pre-Flight Check

Bevor du fortfährst, solltest du die Voraussetzungen für die Durchführung dieses Leitfadens überprüfen:

  1. Grundlagen von Terraform.
  2. Terraform sollte auf deinem lokalen System installiert sein.
  3. Ein AWS-Konto muss auf deinem lokalen System eingerichtet sein.
  4. Grundlagen der Einrichtung eines virtuellen Hosts mit Apache Webserver.

Einrichten des Labors

Auf unserem Ubuntu 22.04-Server installieren wir zunächst den Apache-Webserver und konfigurieren dann virtuelle Hosts mit jeweils einer eigenen index.html-Datei: „Webseite von: Virtueller Host 1.“ für vhost1 und „Webseite von: Virtueller Host 2.“ für vhost2.

Der Einfachheit halber haben wir den Domainnamen für die beiden virtuellen Hosts der IP-Adresse des lokalen Hosts (127.0.0.1) zugeordnet. In diesem Praktikum werden mehrere Dateien verwendet, um eine klare Arbeitsumgebung zu schaffen. Die Beschreibung der Dateien lautet wie folgt:

  1. userdata.sh: Es ist ein Bash-Skript, das den EC2-Server einrichtet und den Webserver für virtuelle Hosts konfiguriert.
  2. sec-grp.tf: Sie definiert eine Ressource zur Erstellung einer Sicherheitsgruppe.
  3. vhost-template.tf: Die Datei mit der eigentlichen Konfiguration, die verwendet werden soll.
  4. main.tf: Hier werden die Webserver-Ressource und der Rest der Infrastruktur angegeben.

Es ist auch möglich, mehrere Dateien zusammenzufassen, aber das macht die Überprüfung des Codes noch komplizierter. Kommen wir nun zu den wichtigsten Schritten:

Schritt 1. Beginnen wir mit der Erstellung eines Verzeichnisses, in dem wir alle Projektdateien ablegen werden:

$ mkdir virtual-hosts-terraform

Schritt 2. Um die EC2-Instanz für das virtuelle Hosting einzurichten, verwenden wir ein Userdata-Skript. Damit automatisieren wir auch unsere allgemeine Serverkonfiguration:

$ vi userdata.sh
#!/bin/bash
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install apache2 -y
sudo systemctl restart apache2
sudo sh -c "echo 127.0.0.1 www.vhost1.com >> /etc/hosts"
sudo sh -c "echo 127.0.0.1 www.vhost2.com >> /etc/hosts"
sudo mkdir -p /var/www/vhost_1/public_html
sudo mkdir -p /var/www/vhost_2/public_html
sudo chown -R $USER:$USER /var/www/vhost_1/public_html
sudo chown -R $USER:$USER /var/www/vhost_2/public_html
sudo chmod -R 755 /var/www
sudo echo "Webpage from: Virtual Host 1." > /var/www/vhost_1/public_html/index.html
sudo echo "Webpage from: Virtual Host 2." > /var/www/vhost_2/public_html/index.html
sudo cp /home/ubuntu/vhosts.conf /etc/apache2/sites-available/vhosts.conf
sudo a2ensite vhosts.conf
sudo a2dissite 000-default.conf
sudo systemctl restart apache2

Schritt 3. Als Nächstes konfigurieren wir eine Sicherheitsgruppenressource, um die Regeln für den eingehenden und ausgehenden Datenverkehr festzulegen. Erlaube den eingehenden SSH- und HTTP-Verkehr von allen Seiten und den ausgehenden von überall her:

$ vi sec-grp.tf
resource "aws_security_group" "ec2-sg" {
name = "ec2-grp"

description = "Set Ingress and Egress Rules "

ingress {

from_port   = 80

to_port     = 80

protocol    = "tcp"

cidr_blocks = ["0.0.0.0/0"]

}

ingress {

from_port   = 22

to_port     = 22

protocol    = "tcp"

cidr_blocks = ["0.0.0.0/0"]

}

egress {

from_port   = 0

to_port     = 0

protocol    = "-1"

cidr_blocks = ["0.0.0.0/0"]

}

}

Schritt 4. Diese Datei enthält die eigentliche Konfiguration für jeden virtuellen Host. Der erste „<VirtualHost>“-Abschnitt enthält den Eintrag für vhost1. Der zweite Abschnitt entspricht dem Eintrag für vhost2vhost2. Du kannst hier weitere vhost-Einträge hinzufügen:

$ vi vhost-template.conf
<VirtualHost *:80>
ServerAdmin admin@vhost1.com

ServerName vhost1

ServerAlias www.vhost1.com

DocumentRoot /var/www/vhost_1/public_html

ErrorLog ${APACHE_LOG_DIR}/error.log

</VirtualHost>

<VirtualHost *:80>

ServerAdmin admin@vhost2.com

ServerName vhost2

ServerAlias www.vhost2.com

DocumentRoot /var/www/vhost_2/public_html

ErrorLog ${APACHE_LOG_DIR}/error.log

</VirtualHost>

Schritt 5. In der Datei main.tf deklarierst du eine Webserver-Ressource und legst den Rest der Infrastruktur fest:

$ vi main.tf
provider "aws" {
region ="us-east-1"

}

resource "aws_instance" "webserver" {
ami ="ami-09d56f8956ab235b3"
instance_type = "t2.micro"
key_name = "Name-of-EC2-Key-Pair"
vpc_security_group_ids = [aws_security_group.demo-sg.id]
associate_public_ip_address = true

provisioner "file" {
source      = "vhost-template.conf"
destination = "/home/ubuntu/vhosts.conf"

connection {
type        = "ssh"
user        = "ubuntu"
private_key = "${file("/Path/to/EC2-Key-Pair")}"
host        = "${self.public_dns}"
}
}
user_data = "${file("userdata.sh")}"

tags = {
Name = "VirtualHostTutorial"
}
}

output "IPAddress" {
value = "${aws_instance.webserver.public_dns}"
}

Der File Provisioner wird verwendet, um die Datei „vhost-template.conf“ auf die EC2-Instanz hochzuladen. Der Ausgabeblock gibt den öffentlichen DNS-Namen der Instanz aus. Ebenso führt der Befehl „file“ das Skript userdata aus.

Dateistruktur

Schritt 6. Nun initialisierst du das Projektverzeichnis mit dem Befehl „init“, gefolgt vom Befehl „apply“:

$ terraform init
$ terraform apply

Projektverzeichnis initialisieren

Anwenden der Terraform-Einrichtung

Einrichtung erfolgreich abgeschlossen

Testen der Einrichtung

Verbinde dich nun per SSH mit deiner Instanz und führe den Befehl aus:

$ curl www.vhost1.com

Der obige Befehl sollte die Nachricht von der Indexseite des virtuellen Hosts 1 zurückgeben, der unten stehende Befehl sollte die Nachricht des virtuellen Hosts 2 anzeigen:

$ curl www.vhost2.com

Testen der Einrichtung

Fazit

Wir haben es endlich geschafft, unser virtuelles Hosting funktioniert wie erwartet. Wir können dieses Tutorial auch mit Terraform durchführen, probiere es einfach aus.

Das könnte dich auch interessieren …