Die dritte Sektion der zentralen Konfigurationsdatei von Apache dient der Definition von virtuellen Servern. Virtuelle Server sind sozusagen Nebenserver, die vom selben Webserver verwaltet werden, aber eine andere Dokumentenwurzel benutzen. Dazu kommt, dass diese Server auch noch entweder über andere IP-Adressen oder andere DNS-Namen ansprechbar sind.

Die Definition eines virtuellen Servers ermöglicht es also dem Webserver zu entscheiden, an welchen DNS-Namen bzw. welche IP-Adresse die Anfrage ging. Diese Entscheidung führt dann zu unterschiedlichen DocumentRoots also werden unterschiedliche Seiten angezeigt.

Linux bietet zu diesem Zweck die Möglichkeit, dass eine einzige Ethernetkarte mehrere IP-Adressen bekommen kann. Dazu wird der Bezeichnung der Ethernetkarte (z.B. eth0) einfach ein Doppelpunkt und eine Nummer zugefügt (eth0:1, eth0:2, …). Jeder dieser „virtuellen Netzwerkkarten“ kann jetzt eine eigene IP-Adresse vergeben werden. Entweder mit dem entsprechenden Konfigurationsprogramm (yast, linuxconf,…) oder mit dem Befehl:

  ifconfig eth0:1 Adresse netmask Maske

Wenn diese zweite (dritte, vierte, …) Adresse jetzt im Nameserver einen eigenen Eintrag erhält, so kann tatsächlich der Webserver darauf reagieren. Dazu müssen in der Konfigurationsdatei ein paar zusätzliche Einträge vorhanden sein:

  NameVirtualHost  IP-Adresse

Dieser Eintrag ist nur nötig, um mehrere namensbasierte Virtuelle Server aufzubauen. Die IP-Adresse ist die der „virtuellen Netzwerkkarte“ wie oben beschrieben.

Jetzt können wir die einzelnen virtuellen Server definieren. Dazu werden wiederum Angaben in spitzen Klammern gemacht, entweder mit IP-Adressen (von virtuellen Karten) oder mit Hostnamen (Alias-Einträge im Nameserver, die auf die virtuelle Karte verweisen).

Jeder dieser Einträge bekommt jetzt einen eigenen DocumentRoot und kann alle bisher besprochenen Direktiven des normalen Servers enthalten. Ein Beispiel:

  NameVirtualHost 10.230.1.101

  <VirtualHost 10.230.1.101>
    ServerAdmin root@marvin.mydomain.de
    DocumentRoot /www2
    ServerName virtual1.mydomain.de
  </VirtualHost>

  <VirtualHost 10.230.1.101>
    ServerAdmin hans@marvin.mydomain.de
    DocumentRoot /www3
    ServerName virtual2.mydomain.de
    <Directory /www3/specialdir>
       AllowOverride All
    </Directory>
  </VirtualHost>

Hier haben wir also zwei virtuelle Hosts definiert, beide wurden über ein und dieselbe IP-Adresse (10.230.1.101) definiert, aber beide unterscheiden sich anhand ihres Namens. Natürlich muß der zweite Name entsprechend im Nameserver vorhanden sein und als Alias auf den ersten Rechner gesetzt sein.

Die zweite Möglichkeit virtueller Hosts ist die Adressenbasierte. Hier ist die Angabe des NameVirtualHost-Befehls nicht nötig. Dafür muß jeder virtuelle Server eine eigene IP-Adresse besitzen. Mit der oben gezeigten Methode ist das bis zu einem bestimmten Punkt möglich. Ab einer gewissen Anzahl (etwa ab 4 virtuellen Hosts) bietet es sich aber an, namensbasierte Hosts zu generieren, statt mit x virtuellen Netzwerkkarten zu arbeiten…

Innerhalb der <VirtualHost> Klammerung können alle Direktiven stehen, die auch schon für die Konfiguration des Hauptservers zur Anwendung kamen. Es sind also vollständig autarke Server, denen sogar eigene CGI-Verzeichnisse gegeben werden können. Das folgende Beispiel zeigt zwei virtuelle Hosts, die Adressenbasiert aufgebaut sind und je ein eigenes cgi-bin Verzeichnis besitzen:

  <VirtualHost 10.230.1.105>
    ServerAdmin root@marvin.mydomain.de
    DocumentRoot /www1/htdocs
    ScriptAlias /cgi-bin/ "www1/cgi-bin/"
    ServerName virtual1.mydomain.de
  </VirtualHost>

  <VirtualHost 10.230.1.106>
    ServerAdmin hans@marvin.mydomain.de
    DocumentRoot /www2/htdocs
    ScriptAlias /cgi-bin/ "www2/cgi-bin/"
    ServerName virtual2.mydomain.de
  </VirtualHost>