VirtualHosts mit nine-manage-vhosts verwalten
Einleitung
Was ist ein Virtual Host?
Virtual Hosting ist der gleichzeitige Betrieb mehrerer Websites(-Domains) auf einem gemeinsamen Host (Server).
Jeder dieser Umgebungen wird als ein Virtueller Host bezeichnet und kann individuell konfiguriert werden für das Hosting. So können mehrere Domains oder IP-Adressen genutzt werden oder benutzerspezifische Ports konfiguriert werden.
Was ist nine-manage-vhosts?
Auf Nine Managed-Servern kommt standardmässig nine-manage-vhosts
zur Verwaltung von Websites zum Einsatz.
Damit lassen sich die Virtual Hosts einfacher und schneller verwalten.
Diese VirtualHost-Konfiguration teilt dem Webserver mit, wo sich die Daten befinden und unter welcher Adresse die Seite aufrufbar ist.
nine-manage-vhosts
unterstützt die Webserver Apache2 sowie Nginx und ist kompatibel zum FTP-Verwaltungstool "FTPAdmin".
nine-manage-vhosts -h
zeigt den Hilfstext mit allen Optionen an.
www-data@server:~ $ # sudo nine-manage-vhosts -h
Manage your virtual hosts, users and certificates.
Usage:
nine-manage-vhosts user create <name> [--no-password | --ask-password | --password=<password>]
nine-manage-vhosts user update <name> (--no-password | --ask-password | --password=<password>)
nine-manage-vhosts user remove <name>
nine-manage-vhosts user list [--json]
nine-manage-vhosts webserver reload
nine-manage-vhosts virtual-host create <domain> [--user=<user>] [--webroot=<webroot>] [--template=<template>] [--template-variable=<template-variable>]... [--no-notify-services]
nine-manage-vhosts virtual-host update <domain> [--user=<user>] [--webroot=<webroot>] [--template=<template>] [--template-variable=<template-variable>]... [--no-notify-services]
nine-manage-vhosts virtual-host remove <domain> [--no-notify-services]
nine-manage-vhosts virtual-host show <domain>
nine-manage-vhosts virtual-host list [--json]
nine-manage-vhosts virtual-host notify-services <domain> [--force]
nine-manage-vhosts alias create <alias_domain> --virtual-host=<domain> [--no-notify-services]
nine-manage-vhosts alias remove <alias_domain> --virtual-host=<domain> [--no-notify-services]
nine-manage-vhosts certificate create --virtual-host=<domain>
nine-manage-vhosts certificate remove --virtual-host=<domain>
nine-manage-vhosts certificate list
nine-manage-vhosts certificate renew-expiring
nine-manage-vhosts certificate register-client --contact-email=<contact-email>
nine-manage-vhosts template list [--json]
nine-manage-vhosts -h | --help
nine-manage-vhosts -v | --version
Options:
--user=<user> Specify the user whose home directory the web app is located in.
--no-password Do not set a password for user.
--ask-password Prompt for user password.
--password=<password> Specify the user's password.
--webroot=<webroot> Specify the absolute document path.
--template=<template> Specify the template of the virtual host. Defaults to configured default template.
--virtual-host=<domain> Specify the virtual host for which the alias should be created.
--contact-email=<contact-email> Specify the contact email address to use for registration.
--json Print machine readable output (JSON).
-h --help Show this help.
-v --version Show version.
Verbindung zum Server erstellen
Standardmässig erhalten Sie bei der Bestellung eines Managed (V)Servers einen SSH/SFTP Zugang für den Systembenutzer "www-data" sowie ein Benutzerkonto für das Nine Cockpit (https://cockpit.nine.ch/).
Weitere Informationen über SSH und SFTP finden Sie unter:
Via SSH haben Sie nun Zugriff auf die Dateistruktur und befinden sich in der Regel nach der Anmeldung am Server im Ordner "/home/www-data". Darin befindet sich der Ordner "logs", in dem Sie die Zugriffs- und Fehler-Logs der jeweiligen Websites einsehen können. Die Log-Dateien sind wie folgt benannt:
Wird ein VirtualHost für einen anderen Benutzer als www-data erstellt, befänden sich die Logs im jeweiligen Benutzerordner nach dem Schema "/home/<benutzer>/logs/".
Virtual Host Verwalten
Um eine Website zu publizieren, müssen folgende Voraussetzungen erfüllt sein:
- Domain im DNS System erfassen unter https://cockpit.nine.ch/ (Falls Sie die DNS-Server von Nine benutzen möchten, geben Sie beim Registrar der Domain die Nameserver ns5.nine.ch und ns6.nine.ch an)
- VirtualHost-Konfiguration auf dem Server mithilfe von nine-manage-vhosts anlegen
- SFTP Verbindung für das Uploaden der Website
Virtual-Host erstellen
Damit die Website publiziert werden kann, braucht es einen Virtual Host. Im folgendem Beispiel sehen Sie den Befehl für das erstellen eines Virtual Host für die Website (Domain) examle.org
www-data@server:~ $ sudo nine-manage-vhosts virtual-host create example.org
Virtual Host created: example.org
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org
TEMPLATE: default
TEMPLATE VARIABLES: MODSEC
Off
PHP_VERSION
7.4
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.org
nine-manage-vhosts
erstellt im obigen Beispiel die Konfiguration für http://example.org sowie http://www.example.org und den Ordner "/home/www-data/example.org" - falls dieser noch nicht existiert -, in den die Website hochgeladen werden kann.
Die oft benutzte Subdomain "www". wird standardmässig mit angelegt und muss nicht separat eingerichtet werden.
Virtual-Hosts auflisten
Mit dem folgendem Befehl kann man alle Virtual Host auflisten und denn Konfigurationen anzeigen lassen:
www-data@server:~ $ sudo nine-manage-vhosts virtual-host list
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org/app
TEMPLATE: default
TEMPLATE VARIABLES: MODSEC
Off
PHP_VERSION
7.4
ALIASES: www.example.org
example.org.server.nine.ch
example.net
Folgend sehen Sie die Definition der einzelnen Parameter:
- DOMAIN: Die Domain bezeichnet bei den Virtual Hosts, den Websitenamen, wie eben z.B example.org.
- USER: Mit User ist der Benutzer gemeint, mit dem man auf den Virtual Host zugreifen kann.
- WEBROOT: Der Webroot ist der Ordner bzw. der Pfad, indem die Website gespeichert wird.
- TEMPLATE: Das Template enthält Apache Konfigurationen, wie SSL, Timeout, Headers etc. Es dient als Vorlage und als Grundkonfiguration.
- TEMPLATE VARIABLES: Die Template Variables hingegen sind noch weitere Bestandteile eines Templates, so kann man z.B ein Template für PHP etc verwenden, die von der Nine vordefiniert wurden.
- ALIASES: Ein Alias dient als Zweitname für Ihre Website.
Virtual-Host bearbeiten
Um einen Virtual Host Eintrag anzupassen, wird nicht create verwendet, sondern update . In diesem Beispiel ändern wir den User zu testuser:
www-data@server:~ $ sudo nine-manage-vhosts virtual-host update example.org --user=testuser
Virtual Host created: example.org
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org
TEMPLATE: default
TEMPLATE VARIABLES: MODSEC
Off
PHP_VERSION
7.4
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.orgudo nine-manage-vhosts virtual-host create example.org
Folgende Parameter können mit dem update Befehl verändert werden:
- USER
- WEBROOT
- TEMPLATE
- TEMPLATE VARIABLES
Eingesetzt werden Sie wie folgt:
nine-manage-vhosts virtual-host update example.org --<Parameter>=<Wert>
Sollten Sie die folgende Fehlermeldung angezeigt bekommen, stellen Sie bitte sicher, dass Sie den update
Befehl verwenden.
Error: Virtual Host example.org already exists
PHP Version anpassen
Mittels der Template Variable PHP_VERSION
kann die vom Virtual Host verwendete PHP Version angepasst werden.
Die zur Verfügung stehenden PHP Versionen hängen von der Ubuntu Version Ihres Systems ab. Eine Übersicht finden Sie in unserem Artikel Welche Softwareversionen sind auf meinem Server verfügbar?.
www-data@server:~ $ sudo nine-manage-vhosts virtual-host update example.org --template-variable=PHP_VERSION=8.2
Virtual Host updated: example.org
example.org
=======
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org
TEMPLATE: default
TEMPLATE VARIABLES: TIMEOUT
300
MODSEC
Off
PHP_VERSION
8.2
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.org
Unterordner - Relativer Pfad
Standardmässig zeigt der Webserver die Index-Datei (index.php, index.html, ...) im Ordner "/home/<benutzer>/<domain>" an. Je nach Applikation ist gegebenenfalls jedoch eine leicht veränderte Ordnerstruktur notwendig. Zum Beispiel muss in solchen Fällen der Inhalt im Unterordner "app" oder "public" liegen, je nach dem, was die Applikation voraussetzt.
Für genau diesen Zweck bietet sich die Option "--webroot" an, mit der dieser Ordner definiert werden kann. Für die Webapplikation, die den Unterordner "app" benötigt, sähe das Kommando wie folgt aus:
www-data@server:~ $ sudo nine-manage-vhosts virtual-host create example.org --webroot=/home/www-data/example.org/app
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org/app
TEMPLATE: default
TEMPLATE VARIABLES: MODSEC
Off
PHP_VERSION
8.2
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.org
Die folgende Konfiguration des soeben erstellten VirtualHosts zeigt in diesem Beispiel die Verwendung der Option "--webroot" mit dem Unterordner "app":
www-data@server:$ sudo nine-manage-vhosts virtual-host show example.org
[...]
ServerName example.org
ServerAlias www.example.org
ServerAlias example.org.server.nine.ch
SetEnvIf Host "example.org.server.nine.ch" TEST_URL
Header set X-Robots-Tag "noindex, nofollow" env=TEST_URL
DocumentRoot /home/www-data/example.org/app
ErrorLog /home/www-data/logs/example.org.error.log
[...]
Der angegebene Ordner muss im home-Ordner des Benutzers liegen.
ServerAlias - Gleicher Inhalt auf mehreren (Sub-)Domains
In manchen Fällen möchte man den Inhalt einer Website unter verschiedenen Domains oder Subdomains erreichbar machen. Damit die Website nicht mehrfach kopiert und konfiguriert werden muss, bietet sich ein sogenannter "ServerAlias" an, welcher wie ein Pseudonym für die Website wirkt. Der Server zeigt die Website mit den konfigurierten Adressen an.
Beispiel zur Erstellung eines Alias example.net zur bestehenden Website example.org:
www-data@server:~ $ sudo nine-manage-vhosts alias create example.net --virtual-host=example.org
example.org
===========
DOMAIN: example.org
ALIASES: www.example.org
example.org.server.nine.ch
example.net
SSL-Zertifikate und Verschlüsselung
Let's Encrypt
Details zu nine-manage-vhosts
mit Let's Encrypt finden Sie unter nine-manage-vhosts mit Let's Encrypt.
Weitere Zertifikatstypen
Für den Fall, dass Let's Encrypt-Zertifikate für Ihren Anwendungsfall nicht geeignet sind, haben wir eine umfassende Übersicht über weitere SSL-Zertifikatsprodukte für Sie erstellt, welche wir offerieren.
Snakeoil-Zertifikat
Mit nine-manage-vhosts
steht mit dem Template "default_snakeoil_https" eine SSL-Vorlage für einen VirtualHost zur Verfügung.
Dabei wird das sogenannte "Snakeoil"-Zertifikat verwendet, welches vom Server automatisch generiert und signiert wurde.
Damit ist eine verschlüsselte Verbindung möglich.
Bitte beachten Sie, dass mit dem "Snakeoil"-Zertifikat im Browser eine Warnmeldung ausgegeben wird, da das Zertifikat nicht von einer offiziellen Zertifizierungsstelle ausgestellt wurde.
Um die Website mit dem "Snakeoil"-SSL-Zertifikat - mit der Vorlage "default_snakeoil_https" - zu konfigurieren, wird der folgende Befehl benötigt:
www-data@server:~ $ sudo nine-manage-vhosts virtual-host create example.org --template=default_snakeoil_https
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org
TEMPLATE: default_snakeoil_https
TEMPLATE VARIABLES: MODSEC
Off
PHP_VERSION
8.2
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.org
Umleitung von HTTP auf HTTPS einrichten
Bei Verwendung von Apache httpd als Managed Service kann die Umleitung mit einer .htaccess-Datei konfiguriert werden.
Die Datei .htaccess
sollte in dem mit nine-manage-vhost definierten Ordner --webroot
(document root) abgelegt werden und folgende Direktiven beinhalten.
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L,QSA]
Wenn Ihre .htaccess-Datei bereits Rewrite-Regeln enthält, sollten Sie die obige Regel an den Anfang stellen.
Beachten Sie, dass es für NGINX keine vergleichbare Alternative zu .htaccess-Dateien gibt, eine Umleitung ist in diesem Fall nur mit einem massgeschneiderten Template möglich.
Wird Apache httpd oder auch NGINX als Proxy für z.B. eine Node.js-Anwendung verwendet, kann die Umleitung mit einem bestehenden Template für nine-manage-vhosts umgesetzt werden.
Analyse der Access Logfiles (goaccess)
Real Time Access Logfiles
GoAccess kann auf der Kommandozeile verwendet wurden um ein spezifisches vhost Access Logfile in real-time zu parsen:
www-data@server:$ goaccess -f /home/www-data/logs/example.org.access.log
Sofern Sie nicht ein benutzerdefiniertes Protokolldateiformat angefordert haben, wählen Sie das Standardformat
[ ] NCSA Combined Log Format
Aktivieren des täglichen Logfileparsers
Hinweis: Beginnend mit Ubuntu 20.04 Focal ist der tägliche Protokollanalysator nicht standardmässig verfügbar. Wenn Sie diese Funktion wünschen, können Sie sich gerne mit uns in Verbindung setzen.
Das tägliche Logfileparsen kann auf vhost-Basis aktiviert werden, um monatliche Reports in HTML Format zu generieren.
Dabei muss beachtet werden, dass der Prozess des Logfileparsens und Generieren der HTML-Files CPU Ressourcen intensiv sein kann. Speziell, wenn die Logfiles gross sind. Darum wird der Parser nicht standardmässig auf allen vHosts aktiviert, sondern kann bei Bedarf eingeschaltet werden.
Die Cron Jobs des Parsers laufen standardmässig am früheren Morgen los und produzieren die ersten Resultate von den "gestrigen", archivierten Logfiles.
www-data@server:$ sudo nine-manage-vhosts job enable goaccess --virtual-host=example.org
Die monatlichen HTML-Dokumente werden jeden Tag früh morgens im WEBROOT Verzeichnis "goaccess" im spezifischen vHost generiert.
Mit folgenden Befehlen können auch "alte" Monate (in diesem Beispiel Juli 2019) nachgeneriert werden:
www-data@server:$ nine-goaccess-parse-data -c 201907 example.org /home/www-data/example.org
Um die monatlich generierten goaccess Reports anzusehen, können mehrere Benutzer angelegt werden mittels htpasswd über den Befehl: nine-goaccess-set-pw -a user1 [webroot von example.org]
www-data@server:$ nine-goaccess-set-pw -a user1 /home/www-data/example.org
Enter new Password:
Adding password for user user1
Your GoAccess Password has been successfully set in the file:
/home/www-data/example.org/goaccess/.htpasswd
You can now login on the Webinterface and inspect the monthly reports using the following credentials:
GoAccess URL: http://<yourdomain>/goaccess/
GoAccess User: user1
INFO:
If you just activated the goaccess job, you need to wait for the next day initialization procedure when the access logs of yesterday are parsed and the first monthly report will be generated.
We add a timeout command in front of the goaccess parser of 20 minutes. That kills the jobs which are running for more than 20 minutes, to ensure that all statistics get through even if there is a massive logfile with lots of information in it to parse.
Wenn der user1 bereits existiert in der htpasswd Datei unter /home/www-data/example.org/goaccess/.htpasswd, wird das Passwort "angepasst" gemäss ihrer neuen Passwort-Definition.
Die existierenden htpasswd Benutzer können auch gelöscht werden:
www-data@server:$ nine-goaccess-set-pw -d user1 /home/www-data/example.org
Deaktivieren des täglichen Logfileparsers
Falls sie das Analysieren der Logfiles stoppen möchten, können Sie den Logfileparser Job einfach deaktivieren und die Verzeichnisse löschen die in der Vergangenheit definiert wurden:
www-data@server:$ sudo nine-manage-vhosts job disable goaccess --virtual-host=example.org
www-data@server:$ rm -rvf ~www-data/example.org/goaccess
www-data@server:$ rm -rvf ~www-data/example.org/.goaccess
Erweiterte Konfiguration
Templates
Neben den üblichen Templates, stehen auch solche für einen Reverse Proxy vHost zur verfügung:
proxy
: Proxy vHost mit HTTPproxy_snakeoil_https
: Proxy vHost mit HTTP und HTTPS (Snakeoil Zertifikat)proxy_letsencrypt_https
: Proxy vHost mit HTTP und HTTPS (Let's Encrypt)proxy_letsencrypt_https_redirect
: Proxy vHost mit Redirect von HTTP nach HTTPS (Let's Encrypt > nur in Kombination mit Apache notwendig)
Alle Proxy Templates unterstützen WebSocket-Verbindungen. Es wird der gleiche Port verwendet, wie für HTTP konfiguriert wurde.
Um den Zielport des Proxypass zu konfigurieren, kann der Parameter --template-variable PROXYPORT
wie folgt verwendet werden:
www-data@server:$ sudo nine-manage-vhosts virtual-host create example.org --template=proxy --template-variable PROXYPORT=8080
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org
TEMPLATE: proxy
TEMPLATE VARIABLES: PROXYPORT
8080
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.org
Dieser Paramater kann zum Erstellen eines neuen vHost (virtual-host create) oder zum Akualisieren eines vHost (virtual-host update) verwendet werden.
Weiterführende Informationen zur Verwendung von Let's Encrypt Zerifikaten mit nine-manange-vhosts finden Sie hier.
Einige Webapplikationen benötigen eine speziell abgestimmte Konfiguration. Zum Beispiel benötigt das Python Web Framework Django immer eine spezielle WSGI-Konfiguration.
Wenn Sie für Ihre Applikation oder Ihre Anwendungsfall ein massgeschneidertes Template benötigen, so senden Sie Ihre Anfrage bitte an . Die Erstellung eines massgeschneiderten Templates wird zu unserem Stundensatz von CHF 250 verrechnet.
Um einen neuen virtuellen Host mit einem solchen Template zu erstellen, können Sie folgenden Befehl als Beispiel nehmen:
www-data@server:~ $ sudo nine-manage-vhosts virtual-host create example.org --template=django
example.org
===========
DOMAIN: example.org
USER: www-data
WEBROOT: /home/www-data/example.org
TEMPLATE: django
TEMPLATE VARIABLES: MODSEC
Off
PHP_VERSION
8.2
ALIASES: www.example.org
example.org.server.nine.ch
To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.org
Wenn Sie vordefinierte Einstellungen für einen bestehenden virtuellen Host verwenden möchten, können Sie ein Template auf den gewünschten virtuellen Host anwenden:
www-data@server:~ $ sudo nine-manage-vhosts virtual-host update example.org --template=default_example
Mit dem folgenden Befehl erhalten Sie eine Liste aller verfügbaren Templates:
www-data@server:~ $ sudo nine-manage-vhosts template list
Timeout
Die Template Variable TIMEOUT (Sekunden) setzt bei PHP-FPM den Parameter ProxyTimeout auf den gewünschten Wert. Der Wert kann in den default Templates und den Proxy Templates angepasst werden auf die gewünschte Sekundenanzahl.
www-data@server:$ sudo nine-manage-vhosts virtual-host update example.org --template-variable=TIMEOUT=1200
Dieses Beispiel stellt sicher, dass lang laufende PHP-FPM Prozesse (oder proxy Requests), länger als der Default-Wert von 300 Sekunden (maximal 1200 Sekunden) laufen dürfen.
PHP CLI Version anpassen
Die verfügbaren PHP CLI Versionen können mit folgendem Befehl angezeigt werden:
www-data@nine01:~ $ sudo nine-manage-vhosts php-cli list
php8.0
php8.1
php8.2
php8.3
Die verfügbaren PHP Versionen können direkt ausgeführt werden.
www-data@nine01:~ $ php8.0 --version
Die derzeit aktive Version kann wie folgt angezeigt werden:
www-data@nine01:~ $ sudo nine-manage-vhosts php-cli show
php8.0
Die Standardversion kann wie folgt angepasst werden:
www-data@nine01:~ $ sudo nine-manage-vhosts php-cli update php8.2
PHP version successfully updated to php8.2