[[Vorlage(Getestet, jammy, noble)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Apache: Umgang mit Apache] }}} [[Inhaltsverzeichnis(3)]] Der [:Apache:]-Webserver kann so konfiguriert werden, dass er für unterschiedliche Hostnamen verschiedene Inhalte liefert. Dies wird als "Virtual Hosting" bezeichnet und ist nützlich, um viele Webseiten auf einem Apache-Webserver zur Verfügung zu stellen. Jede dieser Webseiten nennt sich im Folgenden ''Virtual Host'', es ist nicht notwendig, für jede dieser Websites eine eigene IP-Adresse zu haben ([https://httpd.apache.org/docs/2.4/de/vhosts/ip-based.html IP-basierter Virtual Host] {en}), alle Virtual Hosts können sich eine IP-Adresse teilen ([https://httpd.apache.org/docs/2.4/de/vhosts/name-based.html namensbasierter Virtual Host] {de}). = Einrichtung = Namensbasierte Virtuelle Hosts sind die gängigste Methode zur Konfiguration virtueller Hosts und werden für eine gemeinsame IP-Adresse eingerichtet. Apache entscheidet anhand des HTTP-Headers, bzw. des Hostnamens, welche Seite ausgeliefert wird. Im Verzeichnis '''/etc/apache2/sites-available/''' befindet sich die Datei '''000-default.conf'''. Diese kann man als Vorlage für die weiteren virtuellen Hosts verwenden. Für jeden virtuellen Host wird dann eine eigene Datei angelegt. Anschließend sollte man die Vorlage explizit deaktivieren, um Konflikte zu vermeiden: {{{#!vorlage Befehl sudo a2dissite 000-default.conf }}} == Virtual Hosts konfigurieren == Im Folgenden wird die Standardkonfigurationsdatei des Virtuellen Hosts "default" erklärt, die einzelnen Direktiven sind Links in die deutschsprachige Apache-Dokumentation, wo weitere Informationen verfügbar sind. Am Besten speichert man den Inhalt dieser Datei neu unter '''/etc/apache2/sites-available/'''. Die [http://httpd.apache.org/docs/2.4/de/mod/core.html#virtualhost `VirtualHost`-Direktive] {de} sorgt dafür, dass Apache alle Anfragen aller IP-Adressen für Virtual Hosts verwendet. Es ist auch möglich, dies auf eine von mehreren IPs zu begrenzen. === VirtualHost === Die einzelnen Dateien in '''/etc/apache2/sites-available/-.conf''' : {{{#!code apache . . . }}} Der Dateiname '''muss''' zwingend auf '''.conf''' enden! Ansonsten wird bei Aktivierung des VirtualHost mit `a2ensite` ein Fehler generiert. Der Präfix ist optional und sorgt nur dafür, dass die Konfigurationsdateien in der intuitiven Reihenfolge geladen werden (von 0 aufsteigend). Die VirtualHost-Direktive dient dazu, weitere Direktiven für einen Virtual Host zu definieren. Alles, was zwischen diesen beiden Tags steht, wird __nur__ für diesen einen Virtual Host verwendet. Innerhalb einer Datei können grundsätzlich auch mehrere ``-Blöcke verwendet werden. === ServerAdmin === {{{#!code apache ServerAdmin webmaster@localhost }}} Mit der `ServerAdmin`-Direktive sollte die E-Mail-Adresse des Server-Administrators hinterlegt werden. Diese wird u.a. in den Fehlermeldungen des Apache stehen und ist für den Kontakt zum Administrator erforderlich! === ServerName === {{{#!code apache ServerName servername }}} Mit der `ServerName`-Direktive wird festgelegt, unter welchem primären Namen eine Seite erreichbar ist. Es ist zwingend erforderlich, dass dieser Name entweder via DNS oder alternativ über die Datei [:hosts:'''/etc/hosts'''] auflösbar ist! === ServerAlias === {{{#!code apache ServerAlias name1 name2 name3 }}} Wenn ein und die selbe Seite unter verschiedenen Rechnernamen erreichbar sein muss, ist es erforderlich, diese mit der `ServerAlias`-Direktive zu definieren. Hierbei dürfen keine unerlaubten Zeichen (z.B. Bindestrich) verwendet werden! === DocumentRoot === {{{#!code apache DocumentRoot /var/www/html }}} Mit der Direktive `DocumentRoot` muss das Basisverzeichnis (engl. "document root") des Virtual Hosts (bzw. der Seite) angegeben werden. Sollte nun mit `http://SERVERNAME/datei.html` ein Zugriff versucht werden, so würde Apache in diesem Beispiel die Datei '''/var/www/html/datei.html''' an den Client ausliefern. {{{#!vorlage Hinweis Es ist sehr sinnvoll, für jede Datei unter '''/etc/apache2/sites-available/''' auch einen Ordner unterhalb von '''/var/www/html''' (bzw. '''/var/www/''' für nicht HTML-Ressourcen) anzulegen, da so die Übersicht über mehrere Virtual Hosts einfacher ist. Des Weiteren machen mit einigen Apache-Modulen wie '''suphp''' andere Verzeichnisse als '''/var/www/html''' Probleme! }}} === Directory / Location === Mit der `Directory`- und `Location`-Direktive können Einstellungen getätigt und Berechtigungen für verwendete Verzeichnisse vergeben werden. Beispielsweise kann damit die Ausführung von [https://httpd.apache.org/docs/2.4/howto/cgi.html CGI-Skripten] {en} ermöglicht werden. Mit der [https://httpd.apache.org/docs/2.4/de/mod/core.html#files `Files`-Direktive] {de} können diese Regeln zusätzlich auf einzelne Dateien angewendet werden. Eine detaillierte Erklärung der möglichen Direktiven innerhalb der Directory-Direktive würde den Umfang dieses Wiki-Artikels jedoch bei weitem sprengen. Weitere Informationen findet man in der offiziellen Apache-Dokumentation (s.u.). ==== Physikalische Verzeichnisse ==== Ein physikalisches Verzeichnis ist ein real existierender Ordner im Dateisystem, auch hierfür können Einstellungen und Berechtigungen vergeben werden. {{{#!code apache Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all }}} ==== Virtuelle Verzeichnisse ==== Ein Virtuelles Verzeichnis ist ein Ordner, der mit dem Browser aufgerufen wird, dies ist bei jeder Seite mindestens '''/''', welche für das Basisverzeichnis des Servers steht. {{{#!code apache Options FollowSymLinks AllowOverride None }}} {{{#!vorlage Hinweis Eine Location-Direktive ist nicht unbedingt nötig, auch wird sie nach allen anderen Direktiven (`Directory, .htaccess, Files`) ausgewertet. Der Vorteil einer Location-Direktive ist, dass sie sich auf URLs und nicht auf physikalisch vorhandene Dateien bezieht. }}} ==== Wichtiges innerhalb der Directory-, Location-, oder Files-Direktive ==== Hier als Beispiel die wichtigsten Direktiven innerhalb von Directory: * `Options` - Ermöglicht das Anpassen von Optionen für diesen Pfad * `AllowOverride` - Hiermit kann man einstellen, was innerhalb der Seite mit einer vorhandenen '''.htaccess''' erlaubt ist * ``Require`` - Hiermit können die Zugriffsrechte für dieses Verzeichnis angegeben werden. Mehr Informationen hierzu finden sich in der Apache-Dokumentation zur [https://httpd.apache.org/docs/2.4/howto/auth.html Authentifizierung] {en}. == Beispiel == So würde eine funktionierende Virtual Host-Konfiguration, abgelegt unter '''/etc/apache2/sites-available/maxisforum.example.com.conf''', aussehen. {{{#!code apache ServerName maxisforum.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/maxisforum.example.com/ Options Indexes FollowSymLinks MultiViews AllowOverride None Require all granted # Log-Ausgaben werden in besonderen Dateien abgelegt ErrorLog /var/log/apache2/maxisforum.example.com.error.log LogLevel warn # Format der Log-Ausgabe. Siehe die Referenz unter https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined CustomLog /var/log/apache2/maxisforum.example.com.access.log combined ServerSignature On }}} = Administration = Wenn ein neuer Virtual Host angelegt wurde, ist dieser zwar verfügbar ("available") aber noch nicht aktiviert ("enabled"). Bei auf Debian basierenden Systemen (somit auch Ubuntu) können folgende Befehle verwendet werden: {{{#!vorlage Befehl sudo a2ensite MEIN_VHOST.conf }}} Dies würde den VirtualHost mit dem Dateinamen `MEIN_VHOST` aktivieren. Natürlich kann man die Seite auch wieder deaktivieren mit dem Befehl: {{{#!vorlage Befehl sudo a2dissite MEIN_VHOST.conf }}} {{{#!vorlage Hinweis Wenn man die Seite `000-default.conf` mit `a2dissite` deaktiviert hat, ist sicher zu stellen, dass es eine `NameVirtualHost`-Anweisung gibt! }}} = Namensauflösung für Testzwecke = Um einen VirtualHost ohne vorhandenen DNS Eintrag zu testen, ist es möglich, die Datei [:hosts:'''/etc/hosts'''] hierfür anzupassen. Es muss lediglich der Eintrag von `localhost` angepasst werden. Angenommen eine Datei '''/etc/hosts''' sieht folgendermaßen aus: {{{ 127.0.0.1 localhost }}} könnte man dies so machen: {{{ 127.0.0.1 localhost virtualhosttest }}} Natürlich muss man `virtualhosttest` durch den konfigurierten Hostnamen ersetzen. = Fehlerbehebung = == Fehlerhafte Konfiguration == Mögliche Ursachen für eine fehlerhafte Konfiguration: * In der Direktive `ServerAlias` wurden unerlaubte Zeichen verwendet (z.B. ein Bindestrich, Unterstrich, Umlaute etc.). == Error 403: Forbidden == Befindet sich die Webseite des virtuellen Hosts nicht unter '''/var/www/html''' ist zusätzlich ein Anpassung von '''/etc/apache2/apache2.conf''' erforderlich. Der Daemon kann in der Standardkonfiguration nur auf bestimmte Verzeichnisse zugreifen. Zum Gewähren des Zugriffes ist die genannte Datei zu erweitern: {{{#!code apache Options Indexes FollowSymLinks AllowOverride None Require all granted }}} = Links = == Intern == * [:Apache 2.4:] - Hauptartikel für Apache 2.4 == Extern == * [https://httpd.apache.org/docs/2.4/de/vhosts/ Virtual Hosts Dokumentation] {de} für Apache 2.4, inkl. Beispielen und Erklärungen zu den verschiedenen Direktiven #tag: Netzwerk, Internet, Server, Apache