Server Tools: Virtual Hosts
Virtual Hosts mit Server Tools: PHP-FPM- und Reverse-Proxy-VHosts für Apache und Nginx anlegen, löschen, PHP-Version wechseln, Redirects, Logrotate und VHost-Audit, mit allen Prüfungen und Sonderfällen.
Virtual Hosts
Das VHost-Modul legt Apache- oder Nginx-Konfigurationen an, aktiviert sie und lädt den Webserver neu. Das Backend bestimmt ST_WEBSERVER global, nicht je VHost. Die erzeugten Konfigurationen stehen unter Technische Details.
| Apache | Nginx | |
|---|---|---|
| Konfigurationsdatei | <ST_APACHE_SITES_AVAILABLE>/<domain>.conf |
<ST_NGINX_SITES_AVAILABLE>/<domain> (ohne Endung) |
| Aktivieren | a2ensite |
Symlink nach <ST_NGINX_SITES_ENABLED>/<domain> |
| Module | a2enmod headers proxy_fcgi (PHP) bzw. headers proxy proxy_http (Proxy) |
nicht nötig |
| Reload | apache2ctl configtest, dann systemctl reload apache2 |
nginx -t, dann systemctl reload nginx |
SSL: ssl create, ssl delete, ssl renew |
unterstützt | nicht unterstützt |
SSL: ssl wildcard |
läuft | läuft |
vhost audit (Template-Prüfung) |
unterstützt | nicht implementiert |
Unabhängig vom Backend liegen die Logs jeder Domain unter /var/www/<domain>/logs/ (access.log, error.log).
PHP-VHost anlegen
server-tools vhost create --domain example.com --php 8.3
server-tools vhost create --domain example.com --aliases "www.example.com cdn.example.com" --docroot /var/www/example.com/public
| Option | Bedeutung |
|---|---|
--domain |
Pflicht, gültiger Domainname |
--php |
PHP-Version, Standard ST_DEFAULT_PHP_VERSION. Erlaubt: 7.4, 8.0, 8.1, 8.2, 8.3, 8.4 |
--aliases |
Zusätzliche Namen, durch Leerzeichen getrennt in einem Argument. Jeder Name wird als Domain geprüft |
--docroot |
Eigenes DocumentRoot, muss unter ST_ALLOWED_DOCROOT_PATHS liegen. Standard /var/www/<domain>/html |
--type |
php (Standard) oder proxy |
Ablauf:
- Domain, Aliase und PHP-Version werden geprüft. Der FPM-Socket
/run/php/php<Version>-fpm.sockmuss existieren, sonst bricht der Befehl ab und nennt die gefundenen Versionen. - Existiert die VHost-Datei bereits, warnt das Tool und fragt
Overwrite existing configuration?. - DocumentRoot und
/var/www/<domain>/logswerden angelegt undwww-dataübereignet, das DocumentRoot erhält Rechte 755. - Die Logrotate-Datei
/etc/logrotate.d/vhost-<domain>wird geschrieben. - Eine Willkommensseite
index.phpwird ins DocumentRoot geschrieben. - Die Konfiguration wird mit Rechten 640 geschrieben, der Site aktiviert und der Webserver neu geladen.
- Schlägt der Reload fehl, wird der Site wieder deaktiviert. Die geschriebenen Dateien und Verzeichnisse bleiben liegen.
Legst du einen VHost für eine bestehende Domain erneut an, überschreibt das Tool die VHost-Datei und die
index.phpim DocumentRoot. Mit--yesgeschieht das ohne Rückfrage. Eine bestehendeindex.phpdeiner Site geht dabei verloren.
Reverse-Proxy-VHost anlegen
server-tools vhost create --domain app.example.com --type proxy --backend http://localhost:3000
server-tools vhost create --domain ws.example.com --type proxy --backend http://localhost:3000 --websocket
| Option | Bedeutung |
|---|---|
--backend |
Pflicht. URL mit http:// oder https://, Host, optional Port und Pfad |
--websocket |
Schaltet WebSocket-Weiterleitung ein |
--preserve-host |
Wert false schaltet ProxyPreserveHost ab, jeder andere Wert lässt es eingeschaltet. Standard aus ST_PROXY_PRESERVE_HOST |
Bei Proxy-VHosts werden --php und --docroot nicht ausgewertet, es gibt kein DocumentRoot, nur das Log-Verzeichnis. Die Wirkung im Einzelnen:
- Apache:
ProxyPass / <backend>/undProxyPassReverse. Gib das Backend ohne abschließenden Schrägstrich an, das Tool hängt selbst einen an. Mit--websocketkommenmod_proxy_wstunnel,mod_rewriteund eine Rewrite-Regel dazu, die Upgrade-Anfragen alsws://(beihttps://-Backendwss://) weiterreicht. - Nginx:
proxy_pass <backend>;unverändert, dazu HeaderX-Real-IP,X-Forwarded-For,X-Forwarded-Proto,X-Forwarded-Port. Mit--websocketkommenUpgradeundConnection "upgrade"dazu. Bei--preserve-host falseentfälltproxy_set_header Host $host.
--preserve-host off, wie es der Hilfetext nennt, wird nicht erkannt und lässt ProxyPreserveHost eingeschaltet. Verwendefalse.
Löschen
server-tools vhost delete --domain example.com
Ablauf:
- Der VHost muss existieren.
- Hat die Domain einen zugewiesenen SSH-User (Home
/var/www/<domain>, UID ab 1000), bricht der Befehl ab. Lösche zuerst den User, siehe SSH-User. - Mit
ST_AUTO_BACKUP=truewird die VHost-Datei alsvhost_<domain>_<zeitstempel>.tar.gzinST_BACKUP_DIRgesichert, vor der Rückfrage. - Rückfrage
Delete virtual host '<domain>'? (y/N):. - Site deaktivieren, bei Apache auch
<domain>-le-ssl, Konfigurationsdateien und Logrotate-Datei entfernen. - Findet das Tool in der Konfiguration ein DocumentRoot (PHP-VHosts), folgt die Rückfrage
Also delete DocumentRoot (/var/www/<domain>)?. Bei "ja" wird das gesamte Verzeichnis/var/www/<domain>rekursiv gelöscht, also DocumentRoot, Logs und alles andere darin, ohne Backup. Proxy-VHosts haben kein DocumentRoot, dort gibt es diese Rückfrage nicht und es wird nichts gelöscht. - Webserver neu laden.
Bei VHosts mit DocumentRoot wird mit
--yesauch die zweite Rückfrage mit "ja" beantwortet:vhost delete --yeslöscht dann das Verzeichnis/var/www/<domain>samt Inhalt. Bei Proxy-VHosts wird nichts gelöscht. Gesichert wird nur die VHost-Datei. Ein Zertifikat unter/etc/letsencryptbleibt bestehen, entferne es bei Bedarf mitssl delete.
Auflisten und Info
server-tools vhost list
server-tools vhost info --domain example.com
list zeigt "Active sites" (Dateien in sites-enabled) und "Available sites" (Dateien in sites-available). Bei Apache zählen nur *.conf-Dateien.
info zeigt Domain, Typ (php oder proxy, erkannt am Inhalt der Datei), bei PHP DocumentRoot und PHP-Version, bei Proxy Backend und WebSocket, SSL und Status. Bei Apache gilt SSL als aktiv, wenn <domain>-le-ssl.conf existiert. Bei Nginx steht not applicable (nginx).
PHP-Version wechseln
server-tools vhost php --domain example.com --version 8.4
Das Tool prüft Domain und Version, verlangt den FPM-Socket der Zielversion, sichert die Datei nach /tmp, ersetzt den Socket-Pfad und lädt den Webserver neu. Schlägt der Reload fehl, stellt es die alte Datei wieder her und lädt erneut.
Der Wechsel ändert nur die Datei
<domain>.conf. Hat certbot für die Domain eine eigene<domain>-le-ssl.conferzeugt, trägt diese weiter die alte PHP-Version, bis du sie dort selbst anpasst.
Redirect-VHost
server-tools vhost redirect --from old.example.com --to https://new.example.com/ --code 301
Legt einen eigenen VHost für die Quell-Domain an, der auf die Ziel-URL weiterleitet. --code ist 301 (Standard) oder 302. Existiert für die Domain schon eine Konfiguration, bricht der Befehl ab. Apache verwendet Redirect <code> / <url>, Nginx return <code> <url>;. Es werden weder DocumentRoot noch Logrotate angelegt, und es gibt kein Rollback, wenn der Reload scheitert.
www- und HTTPS-Weiterleitung (nur Menü)
Im Menü "Virtual Host Management" fügen "Add www redirect" und "Force HTTPS redirect" einem bestehenden VHost einen Block hinzu. Das Tool sichert die Datei nach /tmp, fügt den Block vor dem ersten </VirtualHost> (Apache) bzw. vor der letzten Zeile } (Nginx) ein, lädt neu und stellt die Datei bei einem Fehler wieder her.
- www-Weiterleitung: von
<domain>nachhttp://www.<domain>oder umgekehrt, mit Statuscode 301. - HTTPS-Weiterleitung: leitet Anfragen ohne HTTPS auf
https://<host><pfad>um.
Beide Aktionen ändern nur <domain>.conf und prüfen nicht, ob der Block schon vorhanden ist. Ein zweiter Aufruf fügt ihn ein zweites Mal ein.
VHost-Audit
server-tools vhost audit
server-tools vhost audit --domain example.com
Prüft Apache-VHosts gegen die Vorlage, die das Tool erzeugt. Je VHost gibt es vier Prüfungen:
| Prüfung | Bedeutung |
|---|---|
X-Forwarded-Proto |
Header ist in der Datei vorhanden |
X-Forwarded-Port |
Header ist in der Datei vorhanden |
ErrorLog |
Zeigt auf /var/www/<domain>/logs/error.log |
CustomLog |
Zeigt auf /var/www/<domain>/logs/access.log |
Das Beispiel zeigt das Format:
Vhost: example.com
[OK] X-Forwarded-Proto header present
[OK] X-Forwarded-Port header present
[OK] ErrorLog matches canonical path (rotated via /etc/logrotate.d/vhost-example.com)
[DRIFT] CustomLog does not match canonical path /var/www/example.com/logs/access.log (found: CustomLog /var/log/apache2/access.log combined)
Reine Redirect-VHosts werden mit [SKIP] übergangen. Ohne --domain prüft der Befehl alle *.conf in sites-available außer *-le-ssl.conf, 000-default, default-ssl und default. Der Exit-Code ist 1, sobald ein VHost abweicht, sonst 0. Damit lässt sich der Audit in einem Cronjob verwenden. Der Audit ändert nichts.
Bei ST_WEBSERVER=nginx gibt vhost audit --domain die Zeile [SKIP] template audit not yet implemented for nginx aus, vhost audit ohne --domain die Zeile (template audit not yet implemented for nginx, see #13). Beide enden mit Exit-Code 0.