Markus Michalski FAQ

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.

English Version

Zurück zur Übersicht


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:

  1. Domain, Aliase und PHP-Version werden geprüft. Der FPM-Socket /run/php/php<Version>-fpm.sock muss existieren, sonst bricht der Befehl ab und nennt die gefundenen Versionen.
  2. Existiert die VHost-Datei bereits, warnt das Tool und fragt Overwrite existing configuration?.
  3. DocumentRoot und /var/www/<domain>/logs werden angelegt und www-data übereignet, das DocumentRoot erhält Rechte 755.
  4. Die Logrotate-Datei /etc/logrotate.d/vhost-<domain> wird geschrieben.
  5. Eine Willkommensseite index.php wird ins DocumentRoot geschrieben.
  6. Die Konfiguration wird mit Rechten 640 geschrieben, der Site aktiviert und der Webserver neu geladen.
  7. 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.php im DocumentRoot. Mit --yes geschieht das ohne Rückfrage. Eine bestehende index.php deiner 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:

--preserve-host off, wie es der Hilfetext nennt, wird nicht erkannt und lässt ProxyPreserveHost eingeschaltet. Verwende false.

Löschen

server-tools vhost delete --domain example.com

Ablauf:

  1. Der VHost muss existieren.
  2. 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.
  3. Mit ST_AUTO_BACKUP=true wird die VHost-Datei als vhost_<domain>_<zeitstempel>.tar.gz in ST_BACKUP_DIR gesichert, vor der Rückfrage.
  4. Rückfrage Delete virtual host '<domain>'? (y/N):.
  5. Site deaktivieren, bei Apache auch <domain>-le-ssl, Konfigurationsdateien und Logrotate-Datei entfernen.
  6. 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.
  7. Webserver neu laden.

Bei VHosts mit DocumentRoot wird mit --yes auch die zweite Rückfrage mit "ja" beantwortet: vhost delete --yes lö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/letsencrypt bleibt bestehen, entferne es bei Bedarf mit ssl 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.conf erzeugt, 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.

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.

Weiter