Virtual Hosts mit einem Apache-Server

In der Standardkonfiguration eines lokalen Apache-Servers hat man lediglich zwei mögliche Adressen um ihn aufzurufen: localhost und 127.0.0.1, was für eine Homepage vollkommen ausreichend ist. Hat man jedoch mehrere Pages und packt man diese in separate Ordner, z.B. /var/www/domain1, /var/www/domain2 muß man selbige mittels localhost/domain1 und localhost/domain2 aufrufen. Möchte man diese direkt mit einem Domain-Namen aufrufen, muß man sich der sogenannten Virtual Hosts bedienen. Die Einrichtung der Virtual Hosts kann auch für eine lokale Speicherung einer Homepage sinnvoll sein um Probleme mit der PHP-Variablen $DOCUMENT_ROOT zu umgehen. Auf dem Homepage-Speicherplatz des Providers zeigt die URL unter Umständen direkt auf den Speicherplatz, was bedeutet der Pfad zu einer index-Datei sieht so aus: $DOCUMENT_ROOT/index.php. Auf unserem lokalem Speicherplatz ist das Root-Verzeichnis /var/www, also sieht unser Pfad mit den Ordnern so aus: $DOCUMENT_ROOT/domain1/index.php. Durch den Einsatz eines virtual Hosts kann man einen virtuellen Domain-Namen verwenden, der direkt auf das Verzeichnis zeigt und somit hat man das gleiche Verhalten wie auf unserem entfernten Provider-Server.

In diesem Beitrag geht es um die Einrichtung eines Virtual Hosts eines Apache2-Servers unter Debian Gnu/Linux. Leider sind die verwendeten Konfigurations-Dateien für einen Apache-Server von Distribution zu Distibution unterschiedlich und daher kann ich keine Aussage machen, ob diese Konfiguration auch auf andere Linux Distributionen wie Suse, Mandrake oder Fedora übertragbar ist.


Die Datei hosts als DNS-Ersatz

Zuerst einmal, muß man seine Wunschadresse auf den heimischen Rechner umleiten, damit sie bei Eingabe in die Adressleiste des Browsers nicht ins Internet geschickt wird. Man könnte dafür auch einen lokalen Nameserver betreiben, was aber nur für die Umleitung von ein paar Adressen auf den eigenen Rechner etwas zu aufwändig wäre. Einfacher ist dafür die Verwendung der Datei hosts, welche unter Debian im Verzeichnis /etc/hosts gespeichert ist. Bei der Suche nach den zum Namen zugehörigen I.P.-Adressen wird auch diese Datei benutzt und somit kann sie für die Namensauflösung als DNS-Ersatz verwendet werden. Doch Vorsicht! Durch den Eintrag einer realen Domain aus dem Internet welche mit der I.P. des heimischen Rechners verknüpft wird, wird die Internet-Adresse nicht mehr erreicht, da sie auf den lokalen Rechner umgeleitet wird.
In unserem Beispiel möchten wir zwei Domains namens www.domain1.de und www.domain2.de verwenden, welche auf die lokalen Verzeichnisse domain1 und domain2 geleitet werden sollen. Hat man in der Datei hosts noch nichts eingetragen, steht in der Regel lediglich die sogenannte Loopback-Adresse drin und sieht dann so aus:

127.0.0.1      localhost

Für die Umleitung unserer Wunschadressen fügen wir noch zwei weitere Zeilen hinzu:

127.0.0.1      localhost

127.0.0.1      www.domain1.de
127.0.0.1      www.domain2.de

Damit werden unsere Domains schon mal auf den lokalen Rechner geleitet, wo sie von unserem lokalem Apache-Server verarbeitet werden können. Damit der Apache jedoch weiß, wie er mit den Domains umgehen soll, muß man noch ein paar Einträge in die Datei /etc/apache2/httpd.conf tätigen.
Vorab noch ein Hinweis: In einer Standardinstallation eines Apache2-Servers unter Debian sind schon virtuelle Hosts definiert und zwar in den Dateien
/etc/apache2/sites-available/default und
/etc/apache2/ports.conf, jeweils mit der Standard-Bezeichung
<VirtualHost *:80> und
NameVirtualHost *:80.
Da eine Namensgleichheit zu der Warnmeldung
NameVirtualHost *:80 has no VirtualHosts führen würde, werden wir unsere virtuellen Hosts anhand der lokalen I.P.-Adresse benennen.


Die Datei /etc/apache2/httpd.conf

Standardmäßig ist die Datei /etc/apache2/httpd.conf leer, bzw. wenn man die Einstellungen aus Kapitel 1 vorgenommen hat, steht lediglich der Haupt-Domain-Name des Apache-Servers drin:

ServerName localhost

Wir ergänzen die Datei nun um eine NameVirtualHost-Angabe und zwei VirtualHost-Abschnitte:

ServerName localhost

NameVirtualHost 127.0.0.1

<VirtualHost 127.0.0.1>
  ServerName www.domain1.de
  DocumentRoot "/var/www/domain1"
</VirtualHost>

<VirtualHost 127.0.0.1>
  ServerName www.domain2.de
  DocumentRoot "/var/www/domain2"
</VirtualHost>

Damit würden unsere beiden Wunschadressen nach einem Neustart des Apache-Servers mittels
# /etc/init.d/apache2 restart
schon funktionieren und eine Eingabe von www.domain1.de im Webbrowser würde das lokale Verzeichnis /var/www/domain1 aufrufen und selbige Pfadangabe auch als $DOCUMENT_ROOT verwenden. Leider würde die Angabe von localhost zum selben Ergebnis führen, anstatt das Verzeichnis /var/www aufzurufen. Um das zu verstehen, müssen wir uns die Vorgehensweise des Apache-Servers näher betrachten:

Mittels der host-Datei wird unsere Anfrage im Webbrowser auf den lokalen Rechner umgeleitet, wo sie beim Apache-Server eintrifft. Der Server prüft zuerst, ob die Anfrage eine I.P.-Adresse enthält, die der NameVirtualHost-Anweisung entspricht. Ist dies der Fall, sieht er sich jeden <VirtualHost>-Abschnitt mit einer passenden IP-Adresse an und versucht den Einen zu finden, dessen ServerName- oder ServerAlias-Anweisung mit dem gewünschten Hostnamen übereinstimmt. Findet er eine Übereinstimmung wird die Konfiguration dieses VirtualHost-Abschnitts verwendet. Wird kein passender virtueller Host gefunden, dann wird der erste angegebene virtuelle Host verwendet, dessen I.P.-Adresse paßt.

Die Folge davon ist, dass der erste aufgeführte virtuelle Host der Standard-Virtual-Host ist. Die DocumentRoot-Anweisung des Hauptservers wird niemals verwendet, wenn eine I.P.-Adresse mit einer NameVirtualHost-Anweisung übereinstimmt. Damit ist klar, daß unser localhost-Aufruf verloren gegangen ist und an seiner Stelle der erste virtuelle Host (in unserem Fall die Domain www.domain1.de) aufgerufen wird. Möchte man den localhost mit dem Verzeichnis /var/www wiederhaben, muß man ihn auch in einen <VirtualHost>-Container stecken und als erste Anweisung in der Konfigurations-Datei aufführen. Damit sieht unsere httpd.conf so aus:

ServerName localhost

NameVirtualHost 127.0.0.1

<VirtualHost 127.0.0.1>
  ServerName localhost
  DocumentRoot "/var/www"
</VirtualHost>

<VirtualHost 127.0.0.1>
  ServerName www.domain1.de
  DocumentRoot "/var/www/domain1"
</VirtualHost>

<VirtualHost 127.0.0.1>
  ServerName www.domain2.de
  DocumentRoot "/var/www/domain2"
</VirtualHost>

Nach einem Neustart des Apache-Servers mittels
# /etc/init.d/apache2 restart
können sämtliche virtuellen Hosts namens localhost, www.domain1.de und www.domain2.de verwendet werden und ein Aufruf selbiger führt zu einer direkten Weiterleitung in das entsprechende Verzeichnis.