Zum Hauptinhalt springen

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.

Uploaded Image

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:

Uploaded Image

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 das Verzeichnis 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

Weiterleitung von http:// auf https:// einrichten

Eine Umleitung von HTTP auf HTTPS wird mittels einer .htaccess-Datei umgesetzt. Die Datei wird in dem Ordner platziert, in dem die Weiterleitung stattfinden soll.

Beispielsweise example.org im Webroot, also /home/www-data/example.org

Mit folgendem Befehl erstellen wir im Pfad eine .htaccess Datei die wir sofort Editieren können:

www-data@server:$ sudo nano /home/www-data/example.org/.htaccess

Im folgenden Abschnitt ist der Codeteil für die Umleitung, diese kann in die .htaccess Datei kopiert werden:

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L,QSA]

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 HTTP
  • proxy_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 einen spezielles Template möchten, senden Sie uns Ihren Konfigurationswunsch an support@nine.ch. Die Arbeit wird mit unserem Stundensatz von CHF 180.- 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