46.4. Virtuelle Hosts

Virtueller Host bezieht sich auf die Fähigkeit von Apache, mehrere URIs (Universal Resource Identifiers) vom gleichen physischen Computer aus bedienen zu können. In anderen Worten: Mehrere Domänen wie www.beispiel.com und www.beispiel.net können von einem einzigen Webserver auf einem physischen Computer ausgeführt werden.

Virtuelle Hosts werden häufig eingesetzt, um den Verwaltungsaufwand (nur ein Webserver muss verwaltet werden) und die Hardware-Kosten (für die einzelnen Domänen ist kein dedizierter Server erforderlich) zu sparen. Virtuelle Hosts können auf Namen, IP-Adressen oder Anschlüssen basieren.

Virtuelle Hosts können mit YaST (siehe Standard-Host) oder manuell im Abschnitt Virtual Host der Datei httpd.conf (siehe Abschnitt 46.3.2, „Manuelle Konfiguration von Apache“) konfiguriert werden.

In SUSE Linux ist Apache unter /etc/apache2/vhosts.d/ standardmäßig für eine Konfigurationsdatei pro virtuellen Host vorbereitet. Dieses Verzeichnis enthält auch eine allgemeine Vorlage für virtuelle Hosts (vhost.template). Die Konfiguration virtueller Hosts kann aber auch an anderer Stelle vorgenommen werden, zum Beispiel in einer Datei, die anschließend der Konfiguration hinzugefügt wird.

[Important]Wichtig

Es empfiehlt sich, die virtuelle Hostkonfiguration mit httpd2 -S zu überprüfen. Dieser Befehl gibt die virtuellen Hosteinstellungen so aus, wie sie von Apache interpretiert werden. Sie stellen damit sicher, dass Sie das gewünschte Ergebnis erhalten. Wenn Sie Apache mit Flags wie -DSSL verwenden, müssen Sie die gleichen Flags auch beim Testen verwenden. Zum Beispiel: httpd2 -S -DSSL.

46.4.1. Namensbasierte virtuelle Hosts

Namensbasierte virtuelle Hosts können an jeder IP-Adresse mehrere Websites bedienen. Apache verwendet das Hostfeld im vom Client übersandten HTTP-Header, um die Anforderung mit einem übereinstimmenden ServerName-Eintrag der virtuellen Hostdeklarationen zu verbinden. Wird kein übereinstimmender ServerName gefunden, dann wird der erste angegebene VirtualHost als Standard verwendet.

Der Virtual Host-Bereich einer Apache-Konfiguration beginnt mit NameVirtualHost.

46.4.1.1. NameVirtualHost

NameVirtualHost teilt dem Apache-Webserver mit, welche IP-Adresse (und optional welcher Port) auf Client-Anforderungen überwacht werden soll, die den Domänennamen im HTTP-Header enthalten.

Als erstes Argument kann der vollständig qualifizierte Domänenname eingegeben werden - empfohlen wird aber die IP-Adresse. Das zweite, optionale Argument ist der Port. Dieser ist standardmäßig Port 80 und wird mit der Listen-Direktive konfiguriert (Auswahl des Netzwerkgeräts).

Sowohl für die IP-Adresse als auch für die Port-Nummer kann ein Platzhalterzeichen (*) eingegeben werden. In diesem Fall werden die Anforderungen an allen Schnittstellen empfangen. IPv6-Adressen müssen in eckigen Klammern eingeschlossen sein.

Beispiel 46.8. Beispiele für namensbasierte VirtualHost-Einträge

#
NameVirtualHost IP-Adresse[:Port]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost * NameVirtualHost [2002:c0a8:164::]:80 

46.4.1.2. <VirtualHost></VirtualHost> im namensbasierten Kontext

Der <VirtualHost></VirtualHost>-Block enthält die Informationen zu einer bestimmten Domäne. Wenn Apache eine Client-Anforderung für einen definierten VirtualHost empfängt, verwendet es die in diesem Bereich angegebenen Direktiven. In diesem Bereich kann jede Apache-Direktive verwendet werden, die im VirtualHost-Kontext zugelassen ist. In einer namensbasierten virtuellen Hostkonfiguration sind für das VirtualHost-Anfangstag die folgenden Argumente zulässig:

  • IP-Adresse (oder vollständig qualifizierter Domänenname). Die Adresse muss zuvor mit der NameVirtualHost-Direktive deklariert worden sein.

  • Optionale Port-Nummer. Diese muss zuvor mit der NameVirtualHost-Direktive deklariert worden sein.

Anstelle der IP-Adresse wird auch ein Platzhalterzeichen (*) akzeptiert. Diese Syntax ist allerdings nur in Verbindung mit einem Platzhalter in NameVirtualHost * zulässig. IPv6-Adressen müssen in eckige Klammern eingeschlossen werden.

Beispiel 46.9. Namensbasierte VirtualHost-Direktiven

<VirtualHost 192.168.1.100:80>
	ServerName www.beispiel.com
	DocumentRoot /srv/www/htdocs/beispiel.com
	ServerAdmin webmaster@beispiel.com
	ErrorLog /var/log/apache2/www.beispiel.com-error_log
	CustomLog /var/log/apache2/www.beispiel.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
	ServerName www.beispiel.net 
	DocumentRoot /srv/www/htdocs/beispiel.net 
	ServerAdmin webmaster@beispiel.net 
	ErrorLog /var/log/apache2/www.beispiel.net-error_log 
	CustomLog /var/log/apache2/www.beispiel.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]> 
# 2002:c0a8:164:: is the IPv6 equivalent to 192.168.1.100 
	ServerName www.beispiel.org 
	DocumentRoot /srv/www/htdocs/beispiel.org 
	ServerAdmin webmaster@beispiel.org 
	ErrorLog /var/log/apache2/www.beispiel.org-error_log 
	CustomLog /var/log/apache2/www.beispiel.org-access_log common
</VirtualHost> 

In diesem Beispiel befinden sich die Domänen www.beispiel.com und www.beispiel.net auf dem gleichen Computer mit der IP-Adresse 192.168.1.100. Der erste angegebene VirtualHost ist der Standardhost für alle ankommenden Anforderungen auf dem Webserver.

In den Direktiven ErrorLog (siehe Abschnitt 46.3.2.3.4, „ErrorLog Datei | "|Befehl") und CustomLog (siehe http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog) muss der Domänenname nicht angegeben sein. Sie können hier einen beliebigen Namen eingeben.

46.4.2. IP-basierte virtuelle Hosts

Bei dieser alternativen virtuellen Hostkonfiguration werden auf einem Computer mehrere IPs eingerichtet. Auf einer Apache-Instanz befinden sich mehrere Domänen, denen jeweils eine eigene IP zugewiesen ist.

[Important]IP-Adressen und IP-basierte virtuelle Hosts

Auf dem physischen Server muss für jeden IP-basierten virtuellen Host eine eigene IP-Adresse eingerichtet sein. Falls der Computer nicht über die entsprechende Anzahl an Netzwerkkarten verfügt, können auch virtuelle Netzwerkschnittstellen verwendet werden (IP-Aliasing).

46.4.2.1. Konfigurieren von IP-Aliasing

Damit Apache mehrere IPs handhaben kann, muss der physische Computer Anfragen für mehrere IPs akzeptieren. Dies wird auch als Multi-IP-Hosting bezeichnet. Zusätzlich muss im Kernel IP-Aliasing aktiviert sein. Dies ist die Standardeinstellung in SUSE Linux.

Wenn der Kernel für IP-Aliasing konfiguriert ist, können Sie mit den Befehlen ifconfig und route weitere IPs auf dem Host einrichten. Für diese Befehle sind Root-Berechtigungen erforderlich.

Im folgenden Beispiel wird davon ausgegangen, dass auf dem Host bereits die IP-Adresse 192.168.0.10 eingerichtet und dem Netzwerkgerät eth0 zugewiesen ist. Mit dem Befehl ifconfig können Sie die IP des Host anzeigen. Weitere IP-Adressen können mit den folgenden Befehlen hinzugefügt werden:

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0 

Alle diese IP-Adressen werden dem gleichen physischen Netzwerkgerät, nämlich eth0, zugewiesen.

46.4.2.2. <VirtualHost></VirtualHost> im IP-basierten Kontext

Apache kann konfiguriert werden, sobald auf dem System IP-Aliasing eingerichtet ist (oder auf dem Host eine ausreichende Anzahl an Netzwerkkarten zur Verfügung steht). Für jeden virtuellen Server wird ein eigener VirtualHost-Block benötigt.

Das folgende Beispiel zeigt Apache auf einem Computer mit der IP 192.168.1.10, auf dem sich zwei Domänen mit den zusätzlichen IPs 192.168.0.20 und 192.168.0.30 befinden. Dieses spezielle Beispiel funktioniert nur in einem privaten Netzwerk, da IPs von 192.168.0.0 bis 192.168.0.255 nicht in das öffentliche Internet weitergeleitet werden.

Beispiel 46.10. IP-basierte VirtualHost-Direktiven

<VirtualHost 192.168.0.20> 
	ServerName www.beispiel.com
	DocumentRoot /srv/www/htdocs/beispiel.com
	ServerAdmin webmaster@beispiel.com
	ErrorLog /var/log/apache2/www.beispiel.com-error_log
	CustomLog /var/log/apache2/www.beispiel.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30>
	ServerName www.beispiel.net
	DocumentRoot /srv/www/htdocs/beispiel.net
	ServerAdmin tux@beispiel.net
	ErrorLog /var/log/apache2/www.beispiel.net-error_log
	CustomLog /var/log/apache2/www.beispiel.net-access_log common
</VirtualHost> 

In diesem Beispiel sind nur für die beiden zusätzlichen IP-Adressen (also nicht für 192.168.0.10) VirtualHost-Direktiven angegeben. Sollte für 192.168.0.10 auch eine Listen-Direktive konfiguriert sein (siehe Auswahl des Netzwerkgeräts), müsste ein eigener IP-basierter Host für die HTTP-Anforderungen an diese Schnittstelle eingerichtet werden. Anderenfalls fänden die Direktiven aus dem Abschnitt Main Server der Datei /etc/apache2/httpd.conf Anwendung (siehe Abschnitt 46.3.2.3, „Apache-Direktiven in /etc/apache2/httpd.conf: Main Server “).