VirtualHosts beim Apache Webserver einrichten

Kürzlich berichtete ich, wie man bei einem Debian Linux Server einen Apache mit PHP und MySQL Datenbank aufsetzen kann. Ich erwähnte am Ende außerdem, dass teilweise weitere Konfigurationen notwendig bzw. empfehlenswert sind. In diesem Artikel will ich also die Konfiguration von Virtual Hosts (kurz VHOST) im Apache erklären. Welche Vorteile und Möglichkeiten Virtual Hosts haben und wie man sie sauber konfigurieren kann zeige ich hier.

Was sind Virtual Hosts?

Durch Virtual Hosts wird es auf einem Webserver möglich mehrere Web-Anwendungen unter einer IP-Adresse zu betreiben. Das hat den entscheidenden Vorteil auf einem Webserver mehrere Webseiten zu betreiben. Jede dieser Webseiten kann so ein eigener Document Root zugewiesen werden. Die Webseiten können seperat konfiguriert werden, beispielsweise können eigene Logfiles pro VirtualHost geschrieben werden oder eigene eigene rewrite-Rules festgelegt werden. Auf diese Weise können Webseiten komplett getrennt auf ein und demselben Server laufen. Das erleichtert die Fehlersuche und lässt gesonderte Konfigurationen zu.

Wie werden Virtual Hosts eingerichtet?

Bitte beachtet, dass dieser Artikel eine Ergänzung zum Artikel “Linux Webserver einrichten” darstellt.

Um beim Apache Webserver VirtualHosts einzurichten ist nicht viel Arbeit notwendig. Ich versuche die Konfiguration möglichst so zu beschreiben, dass diese bei Bedarf “nachgemacht” werden kann. Virtual Hosts werden grundsätzlich in der Konfiguration des Webservers festgelegt. Unter Debian ist die Konfiguration unter /etc/apache2/ abgelegt. In dem File apache2.conf sind die Konfigurationen zu finden. Ziemlich weit am Ende der Datei steht in etwa so was:

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

Das bedeutet, dass die Konfiguration der Virtual Hosts in dem Unterverzeichnis sites-enable abgelegt wurde. Alle Dateien die sich in diesem Verzeichnis befinden werden vom Apache eingelesen. Es ist empfehlenswert die eigenen VirtualHosts ebenfalls in diesem Verzeichnis abzulegen und zwar jeden VirtualHost in eine eigene Datei.

Für die Dateinamen habe ich mir in diesem Fall ein spezielles Format ausgedacht. Zum einen nummeriere ich sämtliche VirtualHosts der Reihe nach durch. Zum anderen soll der Name der Domain auch im Dateinamen enthalten sein. Zum Beispiel:

001-meine-domain.tld

A-Record Einstellungen bei 1&1

So können die VirtualHosts bei Bedarf schnell gefunden und angepasst werden. Generell bleibt es allerdings jedem selbst überlassen wie und wo man die Konfigurationen für VirtualHosts ablegt. Theoretisch können diese Konfigurationen auch alle in eine Datei geschrieben werden.
Übrigens müssen sämtliche Domains, unter denen der Server bzw. VirtualHost erreichbar sein soll auch auf den Server zeigen. Man kann dazu die IP-Adresse des Servers als A-Record für die Domain festlegen (siehe Screenshot).

Beispiel Virtual Host

Ein Virtual Host ist folgendermaßen aufgebaut:

# meine-domain.tld VHOST Einstellungen

<VirtualHost 192.168.25.84:80>
        ServerAdmin admin@meine-domain.tld

        ServerName www.meine-domain.tld
        ServerAlias meine-domain.tld

        DocumentRoot /var/www/meine-domain.tld/

        <Directory /var/www/meine-domain.tld/>
            Options Indexes FollowSymLinks MultiViews
 AllowOverride FileInfo
 Order allow,deny
            allow from all
        </Directory>

        ErrorDocument 401 /index.php?page=401
        ErrorDocument 403 /index.php?page=403
        ErrorDocument 404 /index.php?page=404
        ErrorDocument 500 /index.php?page=500

        ErrorLog /var/log/apache2/meine-domain.tld_errror.log
        CustomLog /var/log/apache2/meine-domain.tld_access.log common

</VirtualHost>

Das bedeuten die in der Beispielkonfiguration genannten

VirtualHost Tag: Das ist IP und Port des VirtualHosts und sollte in der Regel identisch sein mit den VirtualHosts des Netzwerkinterfaces.

ServerAdmin: Hier kann eine E-Mail-Adresse des Administrators für diesen VirtualHost bzw. Server hinterlegt werden. Dieser wird dann angezeigt, wenn ein Fehler erzeugt wird.

ServerName: Hier wird die Domain des VirtualHost angegeben. Es kann auch der Port angegeben werden: domain.tld:8888

ServerAlias: Hier können alternative Domains, unter denen der Server erreichbar sein soll angegeben werden. Mit Leerzeichen getrennt können auch mehrere Domain-Namen angegeben werden.

DocumentRoot: Der Pfad zum Speicherplatz der Domain sollte sich von anderen VirtualHosts unterscheiden. Der dort enthaltene Code wird beim aufrufen der Domain ausgeführt.

Directory-Tag: Es können noch weitere Einstellungen zum DocumentRoot festgelegt werden.

ErrorDocument: Hier können für diverse HTTP-Status-Fehler-Codes eigene Fehlerseiten definiert werden. Falls man diese Option nicht setzt, werden vom Apache gesetzte Fehlerseiten verwendet. Es sieht in jedem Fall besser aus, wenn jede Webseite seine eigenen Fehlerseiten erhält.

ErrorLog: Mit dieser Option kann ein eigenes Error-Logfile definiert werden. Wenn diese Option nicht gesetzt ist, dann werden Fehler in das Standard-Error-Log vom Apache geschrieben. Dieses wird in der Apache2.conf definiert. Es ist zu empfehlen für jeden VirtualHost ein eigenes ErrorLog zu schreiben. Dies macht die Analyse im Fehlerfall um einiges einfacher.

CustomLog: Ähnlich wie bei ErrorLog, allerdings handelt es sich hier ums AccessLog des VirtualHost. Ein eigenes Access-Log für jeden VirtualHost macht eine Auswertung um einiges einfacher.

Das war es auch schon mit der Grundlegenden Einrichtung von VirtualHosts. Wer sich mit dem Thema näher beschäftigen will, der sollte in jedem Fall mal in der offiziellen Apache Dokumentation vorbeischauen. Dort werden alle Möglichkeiten mit VirtualHosts noch detaillierter beschrieben.