15.10. Virtual Hosts

Mit Virtual Hosts ist es möglich, mehrere Domains mit einem einzigen Webserver ins Netz zu stellen. Auf diese Weise spart man sich die Kosten und den Administrationsaufwand für einen eigenen Server pro Domain. Apache war einer der ersten Webserver, die dieses Feature geboten haben und er bietet mehrere Möglichkeiten für Virtual Hosts:

15.10.1. Namensbasierte Virtual Hosts

Bei namensbasierten Virtual Hosts werden von einer Instanz von Apache mehrere Domains bedient. Die Einrichtung mehrerer IPs für einen Rechner ist hierbei nicht nötig. Dies ist die einfachste Alternative und sie sollte bevorzugt werden. Mehr zu Gründen, die gegen die Verwendung von namensbasierten Virtual Hosts sprechen können, findet man in der Dokumentation zu Apache.

Diese Konfiguration geschieht direkt über die Konfigurationsdatei /etc/apache2/httpd.conf. Um namensbasierte Virtual Hosts zu aktivieren, muss man eine passende Direktive angeben: NameVirtualHost *. Hier reicht die Angabe von *, damit Apache einfach alle eingehenden Anfragen entgegen nimmt. Dann müssen noch die einzelnen Hosts konfiguriert werden:

<VirtualHost *>
    ServerName www.meinefirma.de
    DocumentRoot /srv/www/htdocs/meinefirma.de
    ServerAdmin webmaster@meinefirma.de
    ErrorLog /var/log/httpd/www.meinefirma.de-error_log
    CustomLog /var/log/httpd/www.meinefirma.de-access_log common
</VirtualHost>
<VirtualHost *>
    ServerName www.meineanderefirma.de
    DocumentRoot /srv/www/htdocs/meineanderefirma.de
    ServerAdmin webmaster@meineanderefirma.de
    ErrorLog /var/log/httpd/www.meineanderefirma.de-error_log
    CustomLog /var/log/httpd/www.meineanderefirma.de-access_log common
</VirtualHost>

Hier wie im Folgenden sollte für Apache 2 der Pfad zu den Logdateien von /var/log/httpd in /var/log/apache2 geändert werden. Für die Domain, die der Server ursprünglich gehostet hat (www.meinefirma.de), muss dabei ebenfalls ein VirtualHost-Eintrag angelegt werden. In diesem Beispiel wird also die ursprüngliche Domain und zusätzlich eine weitere Domain (www.meineanderefirma.de) auf demselben Server gehostet.

In den VirtualHost-Direktiven wird wie bei NameVirtualHost ebenfalls ein * angegeben. Den Zusammenhang zwischen der Anfrage und dem Virtual Host stellt Apache über das Host-Feld im HTTP-Header her. Die Anfrage wird an den Virtual Host weitergeleitet, dessen ServerName mit dem in diesem Feld angegebenen Hostnamen übereinstimmt.

Bei den Direktiven ErrorLog und CustomLog ist es nicht entscheidend, dass die Log-Dateien den Domain-Namen enthalten, man kann hier beliebige Namen verwenden.

ServerAdmin benennt die E-Mail-Adresse eines Verantwortlichen, an den man sich bei Problemen wenden kann. Treten Fehler auf, dann gibt Apache diese Adresse in Fehlermeldungen an, die er an den Client zurückschickt.

15.10.2. IP-basierte Virtual Hosts

Für diese Alternative muss man auf einem Rechner mehrere IPs einrichten. Eine Instanz von Apache bedient dann mehrere Domains, wobei jede Domain einer IP zugewiesen ist. Das folgende Beispiel zeigt, wie man Apache so einrichtet, dass er außer auf seiner ursprünglichen IP 192.168.1.10 noch zwei weitere Domains auf zusätzlichen IPs (192.168.1.20 und 192.168.1.21) hostet. Dieses konkrete Beispiel funktioniert natürlich nur in einem Intranet, da IPs aus dem Bereich von 192.168.0.0 bis 192.168.255.0 im Internet nicht weitergeleitet (geroutet) werden.

15.10.2.1. IP-Aliasing einrichten

Damit Apache mehrere IPs hosten kann, muss der Rechner, auf dem er läuft, Anfragen für mehrere IPs akzeptieren. Dies bezeichnet man auch als Multi-IP-Hosting. Dazu muss als erstes IP-Aliasing im Kernel aktiviert sein. Dies ist bei standardmäßig der Fall.

Ist der Kernel für IP-Aliasing konfiguriert, kann man mit den Befehlen ifconfig und route weitere IPs auf dem Rechner einrichten. Um diese Kommandos einzugeben, muss man als root eingeloggt sein. Im Folgenden wird angenommen, dass der Rechner bereits eine eigene IP-Adresse, zum Beispiel 192.168.1.10 hat, die dem Netzwerkdevice eth0 zugewiesen ist.

Welche IP der Rechner verwendet, lässt sich durch Eingabe von ifconfig feststellen. Weitere IPs fügt man dann zum Beispiel auf folgende Weise hinzu:

/sbin/ifconfig eth0:0 192.168.1.20
/sbin/ifconfig eth0:1 192.168.1.21

Alle diese IPs sind dann demselben physikalischen Netzwerkdevice (eth0) zugewiesen.

15.10.2.2. Virtual Hosts mit IPs

Ist IP-Aliasing auf dem System eingerichtet oder der Rechner mit mehreren Netzwerkkarten konfiguriert worden, kann man Apache konfigurieren. Für jeden virtuellen Server gibt man einen eigenen VirtualHost-Block an:

<VirtualHost 192.168.1.20>
    ServerName www.meineanderefirma.de
    DocumentRoot /srv/www/htdocs/meineanderefirma.de
    ServerAdmin webmaster@meineanderefirma.de
    ErrorLog /var/log/httpd/www.meineanderefirma.de-error_log
    CustomLog /var/log/httpd/www.meineanderefirma.de-access_log common
</VirtualHost>

<VirtualHost 192.168.1.21>
    ServerName www.nocheinefirma.de
    DocumentRoot /srv/www/htdocs/nocheinefirma.de
    ServerAdmin webmaster@nocheinefirma.de
    ErrorLog /var/log/httpd/www.nocheinefirma.de-error_log
    CustomLog /var/log/httpd/www.nocheinefirma.de-access_log common
</VirtualHost>

Hier werden VirtualHost-Direktiven nur für die zusätzlichen Domains angegeben, die ursprüngliche Domain (www.meinefirma.de) wird nach wie vor über die entsprechenden Einstellungen (DocumentRoot etc.) außerhalb der VirtualHost-Blöcke konfiguriert.

15.10.3. Mehrere Instanzen von Apache

Bei den vorhergehenden Methoden für Virtual Hosts können die Administratoren einer Domain die Daten der anderen Domains lesen. Will man die einzelnen Domains voneinander abschotten, kann man mehrere Instanzen von Apache starten, die jeweils eigene Einstellungen für User, Group etc. in der Konfigurationsdatei verwenden.

In der Konfigurationsdatei gibt man mit der Listen Direktive an, für welche IP die jeweilige Instanz von Apache zuständig ist. Analog zum vorhergehenden Beispiel lautet diese Direktive dann für die erste Instanz von Apache:

Listen 192.168.1.10:80

Für die anderen beiden Instanzen jeweils:

Listen 192.168.1.20:80
Listen 192.168.1.21:80