Der Begriff „Virtual Host“ bezieht sich auf die Methode, mehr als eine Website wie host1.domain.de, host2.domain.de oder www.domain1.de, www.domain2.de und so weiter auf einem einzigen System zu betreiben. Es gibt zwei Arten von virtuellem Hosting im Apache, nämlich IP-basiertes virtuelles Hosting und namensbasiertes virtuelles Hosting.
Beim IP-basierten virtuellen Hosting kannst du mehrere Websites oder Domains auf demselben System hosten, aber jede Website/Domain hat eine andere IP-Adresse. Beim namensbasierten virtuellen Hosting kannst du mehrere Websites/Domains auf derselben IP-Adresse hosten.
Ubuntu: Apache Virtual Hosts einrichten
Virtuelles Hosting kann nützlich sein, wenn du mehrere Websites und Domains auf einem einzigen physischen Server oder VPS hosten möchtest. Wenn du Zuhause einen eigenen Webserver mit eigener Domain betreiben möchtest, benötigst du das namensbasierten virtuellen Hosting. Die Anleitung wurde unter Ubuntu 20.04 LTS getestet. Sollte aber auch mit anderen Ubuntu-Versionen funktionsfähig sein.
Apache Virtual Hosts für Ubuntu konfigurieren
In dieser Anleitung heißt mein Server UbuntuRaspi und die IP-Adresse ist 192.168.0.11. Als erstes gehen wir die Konfiguration für namensbasierte Virtual Hosts auf dem Apache Webserver durch.
Konfigurieren von namensbasierten virtuellen Hosts
Auf deinem Ubuntu-Computer muss ein Apache Webserver installiert sein.
1. Apache Webserver installieren
Eine ausführliche Anleitung findest du im Beitrag LAMP-Stack Webserver auf Ubuntu 20.04 installieren. Die Kurzform lautet:
sudo apt-get install apache2
Sobald Apache installiert ist, teste, ob der Server funktioniert, indem du die Apache-Testseite im Browser aufrufst. Dazu öffnest du einen Webbrowser und tippst die IP-Adresse (http://IP_Address) ein. Hier im Beispiel: http://192.168.0.11
2. Webverzeichnis für jeden Host erstellen
Für dieses Beispiel legen wir zwei virtuelle Hosts an. Damit du auch später noch verstehst welche Website wo liegt, solltest du am besten die Ordner wie die Domain nennen. Wir verwenden hierzu beispielhaft domain-eins.de und domain-zwei.de.
Als erstes legen wir ein Verzeichnis für den ersten virtuellen Host domain-eins.de an. Dieses Verzeichnis wird für die Speicherung der Daten unserer virtuellen Hosts benötigt.
Tippe hierzu folgenden Befehl ein:
sudo mkdir -p /var/www/html/domain-eins.de
Für den zweiten virtuellen Host legen wir folgendes Verzeichnis an:
sudo mkdir -p /var/www/html/domain-zwei.de
Die beiden oben genannten Verzeichnisse sind Eigentum des Benutzers root. Wir müssen die Eigentümerschaft auf den regulären Benutzer ändern.
Dazu verwenden wir folgenden Befehl:
sudo chown -R $USER:$USER /var/www/html/domain-eins.de
sudo chown -R $USER:$USER /var/www/html/domain-zwei.de
Dabei bezieht sich $USER auf den aktuell angemeldeten Benutzer.
Setze als nächstes mit folgendem Befehl Leserechte für das Apache-Stammverzeichnis, d. h. /var/www/html/
sudo chmod -R 755 /var/www/html/
Wir tun das, weil wir bereits für jeden virtuellen Host ein eigenes Verzeichnis zum Speichern der Daten angelegt haben. Daher haben wir das Apache-Root-Verzeichnis für alle Benutzer außer dem Root-Benutzer als schreibgeschützt gekennzeichnet.
Wir haben die erforderlichen Verzeichnisse für die Speicherung der Daten der einzelnen virtuellen Hosts erstellt und die entsprechenden Berechtigungen eingerichtet. Nun ist es an der Zeit, einige Beispielseiten zu erstellen, die von den einzelnen virtuellen Hosts bedient werden sollen.
3. Test-Websites für jeden Host erstellen
Wir legen eine Test-Website für domain-eins.de mit folgendem Befehl an:
sudo nano /var/www/html/domain-eins.de/index.html
In die neu erstelle Datei fügen wir folgende Zeilen ein:
<html>
<head>
<title>www.domain-eins.de</title>
</head>
<body>
<h1>Hallo! Das ist die Test-Website für domain-eins.de</h1>
</body>
</html>
Anschließend speicherst und schließt du die Datei.
Das gleiche machen wir für domain-zwei.de:
sudo nano /var/www/html/domain-zwei.de/index.html
Hier kopierst du folgende Zeilen hinein:
<html>
<head>
<title>www.domain-zwei.de</title>
</head>
<body>
<h1>Hallo! Das ist die Test-Website für domain-zwei.de</h1>
</body>
</html>
Anschließend speicherst und schließt du die Datei.
4. Konfigurationsdatei für jeden Host erstellen
Als nächstes müssen wir Konfigurationsdateien für jeden virtuellen Host erstellen. Wir beginnen wieder mit domain-eins.de. Dazu kopieren wir den Inhalt der Standarddatei für virtuelle Hosts mit dem Namen 000-default.conf in die neuen Dateien für virtuelle Hosts (siehe unten).
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/domain-eins.de.conf
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/domain-zwei.de.conf
Bitte beachte, dass du alle Konfigurationsdateien mit der Erweiterung .conf am Ende speichern musst, sonst funktioniert es nicht.
Änder nun die Konfigurationsdateien, damit sie mit unseren virtuellen Hosts übereinstimmen:
Bearbeite die domain-eins.de.conf
sudo nano /etc/apache2/sites-available/domain-eins.de.conf
Bearbeite die Werte für ServerAdmin, ServerName, ServerAlias und DocumentRoot, damit diese mit deinem virtuellen Host übereinstimmen:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@domain-eins.de
ServerName domain-eins.de
ServerAlias www.domain-eins.de
DocumentRoot /var/www/html/domain-eins.de
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/domain-eins.de.error.log
CustomLog ${APACHE_LOG_DIR}/domain-eins.de.access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
Speichere und schließe die Datei.
Anschließend passen wir die Konfigurationsdatei für domain-zwei.de.conf an:
sudo nano /etc/apache2/sites-available/domain-zwei.de.conf
Bearbeite die Werte für ServerAdmin, ServerName, ServerAlias und DocumentRoot, damit diese mit deinem virtuellen Host übereinstimmen:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@domain-zwei.de
ServerName domain-zwei.de
ServerAlias www.domain-zwei.de
DocumentRoot /var/www/html/domain-zwei.de
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/domain-zwei.de.error.log
CustomLog ${APACHE_LOG_DIR}/domain-zwei.de.access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
Speichere und schließe die Datei.
5. Aktiviere die Konfigurationsdateien für virtuelle Hosts
Nachdem du die erforderlichen Änderungen vorgenommen hast, deaktiviere die Standardkonfigurationsdatei für virtuelle Hosts, d. h. 000.default.conf, und aktiviere alle neu erstellten Konfigurationsdateien für virtuelle Hosts wie unten gezeigt.
sudo a2dissite 000-default.conf
sudo a2ensite domain-eins.de.conf
sudo a2ensite domain-zwei.de.conf
Starte den Apache-Webserver neu, damit die Änderungen wirksam werden.
$ sudo systemctl restart apache2
Das war’s. Wir haben erfolgreich virtuelle Hosts im Apache konfiguriert. Lasse uns nun überprüfen, ob diese funktionieren oder nicht.
6. Virtual Hosts testen
Wenn du noch keine Domain auf deinen Webserver zeigt, musst du deinem Computer sagen, wo dein Webserver sich befindet. Dazu kannst du auf deinem Computer eine Domain auf eine andere IP-Adresse „umbiegen“.
Diese Einstellung funktioniert nur auf dem jeweiligen Computer und gilt nicht für alle Computer. Eine ausführliche Anleitung wie du einen neuen Server ohne Änderungen am DNS-Eintrag testen kannst, findet du im verlinkten Beitrag.
Die Kurzform: Öffnen die Datei /etc/hosts in einem beliebigen Editor:
sudo nano /etc/hosts
Füge alle deine virtuellen Websites/Domains nacheinander wie unten beschrieben hinzu:
[...]
192.168.0.11 domain-eins.de
192.168.0.11 domain-zwei.de
[...]
Bitte beachte, dass du die obigen Zeilen in die Datei /etc/hosts in jedem Systems einfügen musst, wenn du auf die virtuellen Hosts von beliebigen anderen Computern aus zugreifen möchtest.
Speichern und schließen.
Öffne deinen Webbrowser und tippe ein: http://domain-eins.de und http://domain-zwei.de
Herzlichen Glückwunsch! Du kannst nun auf alle deine Websites zugreifen.
Wie du sicherlich bemerkt hast, haben wir dieselbe IP-Adresse (d. h. 192.168.0.11) für das Hosting von zwei verschiedenen Websites (http://domain-eins.de und http://domain-zwei.de) verwendet. Das nennt sich namensbasiertes virtuelles Hosting.
7. Test beenden
Nach dem erfolgreichen Test solltest du die Einträge aus der hosts Datei wieder löschen. Damit dein Webserver immer zuverlässig erreichbar ist, solltest du eine DynDNS Weiterleitung für deine Domain einrichten. Damit ist dein Webserver immer und von jedem Endgerät unter der gewünschten Domain erreichbar.
Links: Apache-Dokumentation zu virtuellen Hosts
Geek, Blogger, Consultant & Reisender. Auf seiner Detail-Seite findest du weitere Informationen über Benjamin. In seiner Freizeit schreibt Benjamin bevorzugt über Technik-Themen. Neben Anleitungen und How-To’s interessieren Benjamin auch Nachrichten zur IT-Sicherheit. Sollte die Technik nicht im Vordergrund stehen, geht Benjamin gerne wandern.