[[apache:virtuelle-server]]

Virtuelle Webserver mit Apache2

Man teilt einen physikalischen Server/Computer in mehrere virtuelle Teile auf, die dann unterschiedliche Webseiten/Dienste anbieteten.

Der Server lauscht unter verschiedenen IPs. Die verschiedenen Ports laufen dann auf andere Verzeichnisse, das ist gerade für SSL oder TLS-verschüsselte Adressen nötig.

Namens-basierte virtuelle Server werden am häufigsten verwendet, Apache entscheidet anhand der vom Browser gesendeten HTTP/1.1-Header welcher virtueller Server das Ziel ist. Ältere (sehr alte) Browser, die nur HTTP/1.0 unterstüzen landen als immer auf dem ersten virt. Server, allerdings kommen so alte Browser in der Praxis kaum vor.

Man kann leicht Subdomains anlegen, z.B. mail.server.de, www.server.de, …

:!: namensbasierte virtuelle Server sind in Verbindung mit SSL nur sehr eingeschränkt möglich (Zertifikat gilt dann nur für einen der virt. Server). Es muss eine eigene IP pro SSL oder TLS-geschützter Seite existieren. Der Grund ist das die passende IP Teil des HTTP-Request ist, der nur mit dem passenden Host-Schlüssel entschlüsselt werden kann. Da aber der passende Host erst anhand des HTTP-Request ermittelt wird, kann es an dieser Stelle zu keiner Verifizierung kommen.

Hier eine minimale Konfiguration:

Listen 80
NameVirtualHost *

  <VirtualHost *>
  ServerName Domain1.tld
  ServerAlias www.Domain1.tld
  ...
  </VirtualHost>
  
  <VirtualHost *>
  ServerName Domain2.tld
  ServerAlias www.Domain2.tld
  ...
  </VirtualHost>

Auf einem Server/einer IP lauscht der Apache2-Webserver auf verschiedenen Ports, z.B. 80,81,82, 8080, … Die verschiedenen Ports laufen dann auf andere Verzeichnisse.

…in der Apache2-Konfigurationsdatei, es bietet sich an die Anweisungen für virtuelle Server in eigene Datei zu legen.

Hier ist z.B. bei Debian und Ubuntu das Unterzeichnis sites-enabled vorgesehen.

Es ist eine einfache Textdatei die Direktiven (Anweisungen) enthalten. Diese wird beim starten von Apache eingelesen und ausgewertet.

Man legt sog. <Virtual-Host>-Container an die dann die Einstellungen (genauer: Direktiven) für den jeweiligen virtuellen Host an.

Beispiel:

   <VirtualHost 196.23.17.51>
    ServerName www1.mynet.de
    ServerAdmin webguy@mynet.de
    DocumentRoot /var/www1/htdocs
    ErrorLog logs/www1.error_log
    CustomLog logs/www1.access_log common
  </VirtualHost>

Es ist ein Ip-Basierter Virtueller Host
ServerName gibt den angezeigten Namen an
ServerAdmin gibt die eMail des Admins des virt. Servers an
DocumentRoot (ganz wichtig) gibt das Stammverzeichnis an, in dem die Webseiten für diesen Host liegen, man würde also hier beim eingeben von www1.mynet.de die Index-Seite aus /var/www1/htdocs angezeigt bekommen
ErrorLog oder CustomLog gibt andere Speicherort für die Logdateien (fehler- und normale Logdatei)
Dann wird der Comtainer wieder mit </VirtualHost> geschlossen.

Grundsätzlich wird man entweder für die 127.x.x.x-IPs in die hosts-Datei eintragen (schwer zu merken) oder Subdomänen von localhost anlegen (namensbasiert).

Allerdings bleibt immer der Nachteil alle virtuellen Hosts in die hosts-Datei einzutragen (C:\Windows\System32\Drivers\etc\hosts in Windows oder /etc/hosts unter Linux).

Eine elegante Lösung: Komfortabel VirtualHosts für lokales Testing mit Apache.

wenn man es nicht wie oben machen will, hier der umständlichere Weg:

Servername linux.intern
NameVirtualHost *:80

  <VirtualHost *:80>
    ServerName virtuell1.linux.intern
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/virtuell1

    ErrorLog /var/log/apache2/virtuell_error_log
    CustomLog /var/log/apache2/virtuell_access_log combined

  </VirtualHost>


  <VirtualHost *:80>
    ServerName virtuell2.linux.intern
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/virtuell2

    ErrorLog /var/log/apache2/virtuell_error_log
    CustomLog /var/log/apache2/virtuell_access_log combined

  </VirtualHost>

in der /etc/hosts :

127.0.0.1 linux.intern
127.0.0.1 virtuell1.linux.intern
127.0.0.1 virtuell2.linux.intern