Mit virtuellen 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. Es gibt mehrere Möglichkeiten für Virtual Hosts:
namensbasierte virtuelle Hosts
IP-basierte virtuelle Hosts
mehrere Instanzen von Apache auf einem Rechner
Bei namensbasierten virtuellen 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. Gründe, die gegen die Verwendung von namensbasierten virtuellen Hosts sprechen können, findet man in der Dokumentation zu Apache.
Diese Konfiguration geschieht direkt über die Konfigurationsdatei
/etc/apache2/httpd.conf. Um namensbasierte virtuelle
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.example.com
DocumentRoot /srv/www/htdocs/example.com
ServerAdmin webmaster@example.com
ErrorLog /var/log/apache2/www.example.com-error_log
CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>
<VirtualHost *>
ServerName www.meineanderefirma.de
DocumentRoot /srv/www/htdocs/meineanderefirma.de
ServerAdmin webmaster@meineanderefirma.de
ErrorLog /var/log/apache2/www.meineanderefirma.de-error_log
CustomLog /var/log/apache2/www.meineanderefirma.de-access_log common
</VirtualHost>
Für die Domain, die der Server ursprünglich gehostet hat (www.example.com), 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 virtuellen Host stellt Apache über
das Host-Feld im HTTP-Header her. Die Anfrage wird an den virtuellen 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 an den Client
zurückschickt werden.
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 hostet (192.168.1.20 und 192.168.1.21). 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.
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 SUSE LINUX 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
hat, die dem Netzwerkdevice eth0 zugewiesen ist, zum
Beispiel 192.168.1.10.
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:
ip addr add 192.168.1.20/24 dev eth0
Alle diese IPs sind dann demselben physikalischen Netzwerkdevice
(eth0) zugewiesen.
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/apache2/www.meineanderefirma.de-error_log
CustomLog /var/log/apache2/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/apache2/www.nocheinefirma.de-error_log
CustomLog /var/log/apache2/www.nocheinefirma.de-access_log common
</VirtualHost>
Hier werden VirtualHost-Direktiven nur für die
zusätzlichen Domains angegeben, die ursprüngliche Domain (www.example.com) wird nach wie vor über die entsprechenden
Einstellungen (DocumentRoot etc.) außerhalb der
VirtualHost-Blöcke konfiguriert.
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