Wenn Sie auf einem Server mehr als eine Webseite betreiben möchten, bietet die virtuelle Hostkonfiguration1) zwei Möglichkeiten an. Virtuelle Hosts können »IP-basiert« sein, was bedeutet, dass jedes Webangebot eine andere IP besitzt, oder »Namens-basiert«, was bedeutet, dass unter jeder IP-Adresse mehrere Namen laufen. Dieses Tutorial beschränkt sich auf die Verwendung von »Namens-basierten« virtuellen Hosts.
Note: Die Apache Konfiguration wie zB der Speicherort der Document Roots, LogFiles etc können möglicherweise von Ihrer abweichen, da ich mich nicht in dem Apache Standard Document Root »/var/www« aufhalte. Die Installation basiert auf einer Minimal-Installation von Debian 7.5.0 x64.
Die Installation des Apache2 Webservers in seiner Grundausstattung ist denkbar einfach und in wenigen Sekunden erledigt:
# aptitude install apache2
So schaut dann Ihre neuer Internetauftritt aus! In der Standardinstallation befindet sich diese Standard index.html im Standard Document Root /var/www.
Die Verzeichnisstruktur von Apache gliedert sich auf einem Debian System wie folgt:
# tree -d /etc/apache2/ /etc/apache2/ ├── conf.d ← Beinhaltet zusätzliche Konfigurationsdateien ├── mods-available ← Speicherort der installierten Apache Module (→ Debian) ├── mods-enabled ← Symlink aus mods-enabled aktiviert das Modul (→ Debian) ├── sites-available ← Speicherort der verfügbaren Virtual Hosts (→ Debian) └── sites-enabled ← Symlink aus sites-enabled aktiviert die Virtual Hosts (→ Debian)
Jüngere Releases des Apache Webservers haben die bislang üblicherweise verwendete »httpd.conf« nicht mehr im Programm und bauen auf eine neue Konfigurationsdatei »apache2.conf« auf. Ich verwende jedoch weiter eine »httpd.conf« Datei, diese muss ich jedoch in der Standard KOnfigurationsdatei »/etc/apache2/apache2.conf« mit einer »Include«-Anweisung einbinden und logischerweise noch anlegen. Ich habe mich für dieses Setup entschieden, weil ich somit alle benutzerdefinierten Einträge in der »httpd.conf« sammeln kann und die »apache2.conf« erstmal in ihrer Ursprünglichkeit erhalten kann. Bis zu einem gewissen Grad geht das, bei komplexeren Setups vermutlich nicht mehr.
# touch /etc/apache2/httpd.conf
# echo "Include httpd.conf" >> /etc/apache2/apache2.conf
Ein Server kann mehrere IP-Adressen haben, zB weil auf anderen Adressen noch andere Dienste angeboten werden. Dazu ist es bei einer »Namens-basierten« Host Konfiguration notwendig dem Apache Webserver zu sagen auf welchen IP-Adressen er mit Anfragen zu rechnen hat. Das wird mit der Direktive »NameVirtualHost« in der »httpd.conf« bzw. »apache2.conf« eingestellt. Man kann auch mit einem Asterix »*« arbeiten, dann hört der Apache Webserver jede IP-Adresse des Systems ab. Wenn der Server auf mehreren TCP-Ports lauschen soll (zB 443 für HTTPS und 80 für HTTP), dann muss auch der Port noch mit angeben werden. Des Weiteren ist ein »<VirtualHost>« Block für jeden Host notwendig. Wichtig ist dabei, dass die Angaben in der »NameVirtualHost« Direktive und in der »<VirtualHost>« Konfiguration identisch sind, d.h. eine IP-Adresse oder * für alle Adressen.
Die »NameVirtualHost« Direktive wird in die »httpd.conf« (bzw apache2.conf) geschrieben:
# echo "NameVirtualHost 192.168.167.162:80" >> /etc/apache2/httpd.conf
Im nächsten Schritt werden die Konfigurationsdaten der Hosts angelegt. Man könnte die ganzen »<VirtualHost>« Statements auch in einer Konfigurationsdatei zusammenfassen, ich bevorzuge jedoch für jeden Host eine eigene Konfigurationsdatei zu erzeugen:
# touch /etc/apache2/sites-available/sample1.com # touch /etc/apache2/sites-available/sample2.com
Der Inhalt dieser Datei besteht aus folgenden Punkten:
Das »DocumentRoot« der beiden hier verwendeten virtual Hosts müssen noch angelegt werden. Der Name und Pfad sind frei wählbar, muss jedoch mit dem aus der og Konfigurationsdatei übereinstimmen:
# mkdir /home/www.sample1.com # mkdir /home/www.sample2.com
Die Logfiles sollten im Standardpfad für Logdateien »/var/log/apache2« angelegt werden. Dadurch profitieren sie zum einen durch Logrotate um Platz zu sparen und zum anderen legt ein Amok laufendes Logfile nicht gleich den kompletten Server lahm; dazu muss aber »/var« auf einer eigenen Partition liegen. Damit man jedoch bei mehreren Hosts noch sinnvoll zwischen den einzelnen Hosts unterscheiden kann, verwende ich den FQDN im Namen des Logfiles:
# touch /var/log/apache2/www.sample1.com-access.log # touch /var/log/apache2/www.sample2.com-access.log # touch /var/log/apache2/www.sample2.com-error.log # touch /var/log/apache2/www.sample2.com-error.log
Daraus ergibt sich dann folgende Konfigurationsdatei für den ersten der beiden virtuellen Hosts:
/etc/apache2/sites-available/www.sample1.com
<VirtualHost 192.168.167.162:80>
ServerName www.sample1.com
ServerAlias
DocumentRoot /home/www.sample1.com/
ServerAdmin prontos@email.de
CustomLog /var/log/apache2/www.sample1.com-access.log combined
ErrorLog /var/log/apache2/www.sample1.com-error.log
LogLevel warn
</VirtualHost>
Für den zweiten Host verfahren Sie analog dazu.
Die beiden virtuellen Hosts müssen nun noch aktiviert werden. Dazu legen Sie einen Symlink der beiden soeben erstellten Konfigurationsdateien in »/etc/apache2/sites-enabled« an. Verwenden Sie hierfür das Apache2 Utility »a2ensite« für apache2 enable site:
# a2ensite www.sample1.com
Enabling site www.sample1.com.
To activate the new configuration, you need to run:
service apache2 reload
# a2ensite www.sample2.com
Enabling site www.sample2.com.
To activate the new configuration, you need to run:
service apache2 reload
Note: Um einen virtuellen Host wieder zu deaktivieren bzw. um den Symlink wieder zu entfernen verwenden Sie das Utility »a2dissite«.
Eigentlich ist die Kofiguration für zwei virtuelle Hosts nun fertig. Es ist eine gute Idee bevor Sie den Apache neu starten bzw. die Konfiguration neu laden, zuerst einen Syntaxcheck durchzuführen. Dieser ist besonders nützlich, wenn der Server bereits Webseiten online hat, weil durch den Reload einer fehlerhaften Konfiguration uU die bereits laufenden Seiten gestört werden könnten:
# apachectl configtest
Syntax OK
Schaut gut aus, nachdem wir nun durchgeladen haben schießen wir zum Schluss noch mal scharf:
# service apache2 reload
[ ok ] Reloading web server config: apache2.
Schön das unsere Einstellungen scheinbar funktionieren aber sinnvolles lässt sich damit noch nicht anstellen. Um die Konfiguration anschließend zu testen sollten wir jedem Host zumindest eine »index.html« spendieren und diese mit eindeutige Text zu füttern, damit wir die Unterschiede auch feststellen können:
# echo "It works on www.sample1.com" >> /home/www.sample1.com/index.html # echo "It works on www.sample2.com" >> /home/www.sample2.com/index.html
Wie der Name »Namens-basiert« schon ausdrückt, wird hier durch die Angabe des FQDN des Hosts entschieden welcher Host aufgerufen wird. Also entweder »www.sample1.com« oder »www.sample2.com«. Dieses Argument übergibt der Web-Broser und wird vom Web-Server ausgewertet. Da unsere Test-Domänen aber keinen gültigen A-Record besitzen müssen wir zum Testen der Konfiguration die DNS Einträge in der lokalen »/etc/hosts« Datei auf dem Rechner anlegen, von welchem aus am Ende die Konfiguration getestet werden soll; hier zB mein Heim-PC.
/etc/hosts
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 192.168.167.162 www.sample1.com 192.168.167.162 www.sample2.com 255.255.255.255 broadcasthost ::1 localhost fe80::1%lo0 localhost
Fortan hören die beiden virtuellen Hosts auf Ohre Namen und werten das dazugehörige DocumentRoot aus:
It's just that simple
prontosystems - we are connecting more than computers
— pronto 2010/04/25 18:08
— pronto 2014/06/01 17:12 Update Article