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