Virtuelle Hosts auf Apache2 Webserver einrichten

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.

Apache Installation

Die Installation des Apache2 Webservers in seiner Grundausstattung ist denkbar einfach und in wenigen Sekunden erledigt:

# aptitude install apache2

Das wars auch schon, das Ergebnis können Sie sofort in Ihrem Browser überprüfen:

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)

httpd.conf / apache2.conf

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

Virtual Host Direktive

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

Virtual Host Konfiguratiopnsdatei

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:

  • ServerName: Das ist der FQDN des virtual Host, zB www.sample1.com
  • ServerAlias: Nicht zwingend notwendig aber nützlich wenn der Host zB auch über eine Subdomain erreichbar sein soll zB test.sample1.com
  • DocumentRoot: Das Homeverzeichnis des virtual Hosts; zB /home/www.sample1.com
  • ServerAdmin: Gehört zum guten Ton und sollte die E-Mail Adresse des Server Administrators beinhalten
  • CustomLog: Der absolute Pfad zum Access-Logfile
  • ErrorLog: Der absolute Pfad zum Errror-Logfile
  • LogLevel: Definiert wie ausführlich geloggt wird

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.

Enable Site

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.

Testen der Konfiguration

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

tux/apache_vhost.txt (22320 views) · Zuletzt geändert: 2014/06/01 20:00 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0