EUserv vServer Active - Installation des Webservers
Seit dem letzten Artikel läuft auf dem Virtual-Server ein ressourcen-sparsames aber mächtiges Mailsystem. In diesem Beitrag geht es um die Einrichtung eines Webservers.
Dazu werden folgende Komponenten installiert:
Für Cherokee habe ich mich entschieden, da es für die weiter verbreiteten Webserver Apache httpd und lighttpd schon mehr als genug Anleitungen und Howtos gibt. Falls Bedarf besteht würde ich deren Installation (sowie die von nginx und eventuell LiteSpeed) ebenfalls beschreiben.
Die Installation von PHP dient lediglich zur Demonstration, wie dynamischer Content gehostet werden könnte. Für andere Skriptsprachen ist das Vorgehen ähnlich und wird imm Cherokee Cookbook für weitere Applikationen beschrieben.
PHP wird dabei über die FastCGI-Schnittstelle von Cherokee eingebunden. Einen generellen Überblick über die Vor- und Nachteile von PHP über diese Schnittstelle liefert z. B. dieser Artikel im RootForum.de Wiki.
Dazu werden folgende Komponenten installiert:
Für Cherokee habe ich mich entschieden, da es für die weiter verbreiteten Webserver Apache httpd und lighttpd schon mehr als genug Anleitungen und Howtos gibt. Falls Bedarf besteht würde ich deren Installation (sowie die von nginx und eventuell LiteSpeed) ebenfalls beschreiben.
Die Installation von PHP dient lediglich zur Demonstration, wie dynamischer Content gehostet werden könnte. Für andere Skriptsprachen ist das Vorgehen ähnlich und wird imm Cherokee Cookbook für weitere Applikationen beschrieben.
PHP wird dabei über die FastCGI-Schnittstelle von Cherokee eingebunden. Einen generellen Überblick über die Vor- und Nachteile von PHP über diese Schnittstelle liefert z. B. dieser Artikel im RootForum.de Wiki.
Vor der eigentlichen Installation von Cherokee und PHP werden noch die USE-Flags für beide Programme angepasst und die Datei /etc/portage/suidctl.conf erweitert.
Danach können der Webserver, PHP und sudo wie gewohnt mit emerge installiert werden. Wozu sudo nötig ist, wird später noch klar.
Im Gegensatz zu anderen Webservern bringt Cherokee eine eigene Administrationsoberfläche mit, über das der Webserver konfiguriert werden kann. Dieses wurde dank des USE-Flags admin mitinstalliert und kann direkt gestartet werden. Das passiert am besten innerhalb einer screen-Session, so dass trotz des durch das Webinterface blockierte Terminal weitergearbeitet werden kann.
Das Programm cherokee-admin generiert ein zufälliges Passwort, mit dem man sich auf dem Webinterface einloggen kann. Aus Sicherheitsgründen wird die Webanwendung nur an das Loopback-Device gebunden und ist daher von außen nicht erreichbar.
Diese Sicherheitsfunktion kann ausgeschaltet werden, wenn man cherokee-admin mit dem Parameter -b startet, es ist jedoch eher zu empfehlen, über einen SSH-Tunnel auf das Webinterface zuzugreifen. Der SSH-Tunnel könnte z. B. folgendermaßen mit dem SSH-Client von dem Clientrechner aufgebaut werden:
Bei anderen SSH-Clients sollte zuvor das Handbuch konsultiert werden.
Das Webinterface wäre mit obigem Beispiel unter http://localhost:9090/ erreichbar und bei Aufruf der URL in einem Browser erscheint der freundliche Willkommensbildschirm.

In diesem sollte unter dem Menüpunkt Virtual Servers (in anderen Webservern auch Virtual Hosts genannt) der Eintrag default ausgewählt werden.

Im Tab Logging sollten die Pfade zu den Webserver Logdateien auf /var/log/cherokee/access_log und /var/log/cherokee/error_log geändert werden.

Parallel legen wir auf dem vServer das Verzeichnis /var/log/cherokee an und weisen es dem richtigen Benutzer zu.
Jetzt geht es zur Einrichtung von PHP. Aus Sicherheitsgründen soll jeder Benutzer (bzw. jede Domain) einen eigenen PHP-Interpreter erhalten, der unter der jeweiligen Benutzerkennung läuft. Das hat den Vorteil, dass ein Benutzer mit seinem PHP-Skript nie auf den Inhalt von Dateien anderer Benutzer zugreifen kann.
Dazu wurde zuvor sudo installiert, mit dem ein Benutzer (in diesem Fall cherokee) Kommandos unter der Kennung eines anderen Benutzers ausführen kann. Damit nicht beliebige Benutzer beliebige Kommandos ausführen können, wird die sudo-Konfiguration in /etc/sudoers sehr restriktiv ausfallen:
Mit dieser Konfiguration ist es dem Benutzer cherokee (und nur diesem!) erlaubt, das Programm /usr/bin/php-cgi (unseren PHP-Interpreter mit FastCGI-Unterstützung) mit beliebigen Parametern aufzurufen. Die Zielbenutzer, unter deren Kennung das Programm ausgeführt werden darf, sind web1 und web2. Wenn weitere Domains mit PHP-Unterstützung bzw. Benutzer hinzugefügt werden, muss die sudo-Konfiguration entsprechend erweitert werden.
Doch die sudo-Konfiguration ist nur ein Teil. Es wird noch ein Startskript benötigt, das der Webserver ausführt, wenn ein PHP-Skript aufgerufen wird und noch kein Interpreter läuft. Im Internet findet man ziemlich viele solcher simplen Skripte. Allen gemeinsam ist, dass pro Virtual Host bzw. pro Benutzer ein eigenes Skript benötigt wird. Das ist bei diesem nicht der Fall. Die wichtigsten Parameter wie Benutzer oder Konfigurationsverzeichnis können von außen (genauergesagt: vom Webserver) dynamisch gesetzt werden, so dass insgesamt nur noch ein Skript notwendig ist.
Die Dateien für die einzelnen Domains werden unter /var/www angelegt. Der Default Virtual Host liegt z. B. unter /var/www/localhost/htdocs. Für unsere Domain legen wir einen eigenen Benutzer und eine entsprechende Verzeichnisstruktur an.
In Bildern sieht das folgendermaßen aus:

Zu beachten ist dabei, dass die Umgebungsvariablen für den FastCGI-Interpreter korrekt angegeben werden. Der Pfad in PHP_SOCKET muss unbedingt mit dem in Connection angegebenen Pfad übereinstimmen und der Benutzername in PHP_USER muss dem zuvor angelegten Benutzer entsprechen, dem auch das Verzeichnis unter /var/www gehört. Der Name (Nick) ist beliebig, sollte aber sinnvoll gewählt werden, so dass man ihn später auch wiedererkennt.
Nun wird die konkrete Domain unter dem Menüpunkt Virtual Servers angelegt. Im Tab Basics muss lediglich der Nickname (entspricht dem Domainnamen) und das Document Root (z. B. /var/www/example.com/htdocs eingetragen werden. Weitere Domainnamen für den gleichen Virtual Host können unter dem Tab Domain names eingetragen werden, z. B. die Variante mit www-Subdomain.

Unter dem Tab Behavior werden die Handler für den Virtual Host verwaltet, so auch der FastCGI-Handler für PHP-Skripte. Das Target php muss dabei, wie im Screenshot gezeigt, mit dem Rule Type Extension und für die Erweiterung php angelegt werden.

Unter dem Tab Handler muss nun die zuvor angelegte Information Source ausgewählt werden.

Zurück in der Konfiguration des Virtual Hosts müssen nun lediglich noch die Pfade zu den Logdateien angepasst werden. Im Beispiel wird der Pfad /var/www/example.com/log/access_log für das Access Log und /var/www/example.com/log/error_log für das Error Log eingetragen. Das Logging Format wird auf Apache compatible gesetzt, so dass Programme wie Webalizer oder AWStats ohne eine spezielle Konfiguration etwas damit anfangen können.

Damit ist die Konfiguration beendet und kann mit Klick auf Save in der linken Menüleiste gespeichert werden. Cherokee kann nun entweder ebenfalls über das Webinterface oder mit dem von Gentoo mitgelieferten Initskrip gestartet werden. Letzteres muss auch noch in den entsprechenden Runlevel eingetragen werden, damit der Webserver auch nach einem Serverneustart wieder gestartet wird.

Sobald der Webserver läuft und die erste Anfrage an ein PHP-Skript kommt, wird der PHP-Interpreter mit FastCGI-Unterstützung gestartet. Dank des Wrappers läuft PHP dabei nicht unter der Kennung des Webservers, sondern jeweils unter einer eigenen Benutzerkennung.
Auf meinem System sind derzeit zwei Virtual Hosts mit PHP-Unterstützung eingerichtet, so dass auch (mindestens) zwei Instanzen des PHP-Interpreters laufen.
Nach der Installation des Webservers mit PHP und zwei laufenden PHP-Interpretern sieht der Speicherverbrauch auf dem vServer Active folgendermaßen aus:
Über die Themen der folgenden Artikel bin ich mir noch nicht sicher. Da jeder Artikel im Prinzip einen bestimmten Dienst bzw. Dienstekomplex behandelt (wie Mailsystem, Webserver), stehen derzeit folgende Ideen im Raum:
# cat>/etc/portage/package.use<<EOF www-servers/cherokee admin coverpage dev-lang/php -* crypt iconv nls pcre session spl ssl unicode zlib cgi cli discard-path fastbuild filter force-cgi-redirect gd hash imap pdo reflection simplexml suhosin xml EOF # cat>>/etc/portage/suidctl.conf<<EOF /usr/bin/sudo /usr/bin/sudoedit
Danach können der Webserver, PHP und sudo wie gewohnt mit emerge installiert werden. Wozu sudo nötig ist, wird später noch klar.
# emerge sudo cherokee php
Im Gegensatz zu anderen Webservern bringt Cherokee eine eigene Administrationsoberfläche mit, über das der Webserver konfiguriert werden kann. Dieses wurde dank des USE-Flags admin mitinstalliert und kann direkt gestartet werden. Das passiert am besten innerhalb einer screen-Session, so dass trotz des durch das Webinterface blockierte Terminal weitergearbeitet werden kann.
# screen (eine neue Sitzung wird geöffnet) # cherokee-admin Login: User: admin One-time Password: bK4rEdYLjAqNuQ6i Cherokee Web Server 0.98.1 (Feb 8 2009): Listening on port 127.0.0.1:9090, TLS disabled, IPv6 disabled, using epoll, 1024 fds system limit, max. 505 connections, caching I/O, single thread
Das Programm cherokee-admin generiert ein zufälliges Passwort, mit dem man sich auf dem Webinterface einloggen kann. Aus Sicherheitsgründen wird die Webanwendung nur an das Loopback-Device gebunden und ist daher von außen nicht erreichbar.
Diese Sicherheitsfunktion kann ausgeschaltet werden, wenn man cherokee-admin mit dem Parameter -b startet, es ist jedoch eher zu empfehlen, über einen SSH-Tunnel auf das Webinterface zuzugreifen. Der SSH-Tunnel könnte z. B. folgendermaßen mit dem SSH-Client von dem Clientrechner aufgebaut werden:
$ ssh -L9090:127.0.0.1:9090 user@example.com
Bei anderen SSH-Clients sollte zuvor das Handbuch konsultiert werden.
Das Webinterface wäre mit obigem Beispiel unter http://localhost:9090/ erreichbar und bei Aufruf der URL in einem Browser erscheint der freundliche Willkommensbildschirm.
In diesem sollte unter dem Menüpunkt Virtual Servers (in anderen Webservern auch Virtual Hosts genannt) der Eintrag default ausgewählt werden.
Im Tab Logging sollten die Pfade zu den Webserver Logdateien auf /var/log/cherokee/access_log und /var/log/cherokee/error_log geändert werden.
Parallel legen wir auf dem vServer das Verzeichnis /var/log/cherokee an und weisen es dem richtigen Benutzer zu.
# mkdir /var/log/cherokee # chown cherokee:cherokee /var/log/cherokee
Jetzt geht es zur Einrichtung von PHP. Aus Sicherheitsgründen soll jeder Benutzer (bzw. jede Domain) einen eigenen PHP-Interpreter erhalten, der unter der jeweiligen Benutzerkennung läuft. Das hat den Vorteil, dass ein Benutzer mit seinem PHP-Skript nie auf den Inhalt von Dateien anderer Benutzer zugreifen kann.
Dazu wurde zuvor sudo installiert, mit dem ein Benutzer (in diesem Fall cherokee) Kommandos unter der Kennung eines anderen Benutzers ausführen kann. Damit nicht beliebige Benutzer beliebige Kommandos ausführen können, wird die sudo-Konfiguration in /etc/sudoers sehr restriktiv ausfallen:
# # cat>/etc/sudoers<<EOF # User alias specification User_Alias PHP_USER = cherokee # Cmnd alias specification Cmnd_Alias PHP_CGI = /usr/bin/php-cgi * # Defaults specification Defaults:PHP_USERS env_keep="PHP_USER PHP_GROUP PHP_SOCKET PHP_FCGI_MAX_REQUESTS PHP_FCGI_CHILDREN PHPRC PHP_INI_SCAN_DIR FCGI_WEB_SERVER_ADDRS" # Runas alias specification Runas_Alias WEB_USERS = web1, web2 # User privilege specification root ALL=(ALL) ALL PHP_USER ALL=(WEB_USERS) NOPASSWD: PHP_CGI EOF
Mit dieser Konfiguration ist es dem Benutzer cherokee (und nur diesem!) erlaubt, das Programm /usr/bin/php-cgi (unseren PHP-Interpreter mit FastCGI-Unterstützung) mit beliebigen Parametern aufzurufen. Die Zielbenutzer, unter deren Kennung das Programm ausgeführt werden darf, sind web1 und web2. Wenn weitere Domains mit PHP-Unterstützung bzw. Benutzer hinzugefügt werden, muss die sudo-Konfiguration entsprechend erweitert werden.
Doch die sudo-Konfiguration ist nur ein Teil. Es wird noch ein Startskript benötigt, das der Webserver ausführt, wenn ein PHP-Skript aufgerufen wird und noch kein Interpreter läuft. Im Internet findet man ziemlich viele solcher simplen Skripte. Allen gemeinsam ist, dass pro Virtual Host bzw. pro Benutzer ein eigenes Skript benötigt wird. Das ist bei diesem nicht der Fall. Die wichtigsten Parameter wie Benutzer oder Konfigurationsverzeichnis können von außen (genauergesagt: vom Webserver) dynamisch gesetzt werden, so dass insgesamt nur noch ein Skript notwendig ist.
# # cat>/usr/local/bin/php-starter.sh<<EOF
#!/bin/sh
# Default values
PHP_USER=${PHP_USER:="cherokee"}
PHP_SOCKET=${PHP_SOCKET:="/tmp/php-fcgi.sock"}
PHP_FCGI_MAX_REQUESTS=${PHP_FCGI_MAX_REQUESTS:="2000"}
PHP_FCGI_CHILDREN=${PHP_FCGI_CHILDREN:="5"}
FCGI_WEB_SERVER_ADDRS=${FCGI_WEB_SERVER_ADDRS:="127.0.0.1"}
#PHPRC
#PHP_INI_SCAN_DIR
SUDO="/usr/bin/sudo"
PHP_CGI="/usr/bin/php-cgi"
export PHP_USER PHP_SOCKET PHP_FCGI_MAX_REQUESTS PHP_FCGI_CHILDREN FCGI_WEB_SERVER_ADDRS PHPRC PHP_INI_SCAN_DIR
exec ${SUDO} -H -u ${PHP_USER} ${PHP_CGI} -b "${PHP_SOCKET}" "$@"
EOF
# chmod 0755 /usr/local/bin/php-starter.shDie Dateien für die einzelnen Domains werden unter /var/www angelegt. Der Default Virtual Host liegt z. B. unter /var/www/localhost/htdocs. Für unsere Domain legen wir einen eigenen Benutzer und eine entsprechende Verzeichnisstruktur an.
# useradd -d /var/www/example.com -s /sbin/nologin -U web1
# mkdir -p /var/www/example.com/{etc/php,htdocs,log,tmp}
# chown web1:cherokee /var/www/example.com
# chmod g+w /var/www/example.com/log Die eigentlichen Dateien der Webseite werden unter /var/www/example.com/htdocs gespeichert, die Logs für die Domain unter /var/www/example.com/log und temporäre Dateien sowie der UNIX-Socket für den PHP FastCGI-Interpreter unter /var/www/example.com/tmp.In Bildern sieht das folgendermaßen aus:
Zu beachten ist dabei, dass die Umgebungsvariablen für den FastCGI-Interpreter korrekt angegeben werden. Der Pfad in PHP_SOCKET muss unbedingt mit dem in Connection angegebenen Pfad übereinstimmen und der Benutzername in PHP_USER muss dem zuvor angelegten Benutzer entsprechen, dem auch das Verzeichnis unter /var/www gehört. Der Name (Nick) ist beliebig, sollte aber sinnvoll gewählt werden, so dass man ihn später auch wiedererkennt.
Nun wird die konkrete Domain unter dem Menüpunkt Virtual Servers angelegt. Im Tab Basics muss lediglich der Nickname (entspricht dem Domainnamen) und das Document Root (z. B. /var/www/example.com/htdocs eingetragen werden. Weitere Domainnamen für den gleichen Virtual Host können unter dem Tab Domain names eingetragen werden, z. B. die Variante mit www-Subdomain.
Unter dem Tab Behavior werden die Handler für den Virtual Host verwaltet, so auch der FastCGI-Handler für PHP-Skripte. Das Target php muss dabei, wie im Screenshot gezeigt, mit dem Rule Type Extension und für die Erweiterung php angelegt werden.
Unter dem Tab Handler muss nun die zuvor angelegte Information Source ausgewählt werden.
Zurück in der Konfiguration des Virtual Hosts müssen nun lediglich noch die Pfade zu den Logdateien angepasst werden. Im Beispiel wird der Pfad /var/www/example.com/log/access_log für das Access Log und /var/www/example.com/log/error_log für das Error Log eingetragen. Das Logging Format wird auf Apache compatible gesetzt, so dass Programme wie Webalizer oder AWStats ohne eine spezielle Konfiguration etwas damit anfangen können.
Damit ist die Konfiguration beendet und kann mit Klick auf Save in der linken Menüleiste gespeichert werden. Cherokee kann nun entweder ebenfalls über das Webinterface oder mit dem von Gentoo mitgelieferten Initskrip gestartet werden. Letzteres muss auch noch in den entsprechenden Runlevel eingetragen werden, damit der Webserver auch nach einem Serverneustart wieder gestartet wird.
# /etc/init.d/cherokee start # rc-update add cherokee defaultWenn die Weboberfläche nicht mehr benötigt wird, kann cherokee-admin nun beendet werden.
Sobald der Webserver läuft und die erste Anfrage an ein PHP-Skript kommt, wird der PHP-Interpreter mit FastCGI-Unterstützung gestartet. Dank des Wrappers läuft PHP dabei nicht unter der Kennung des Webservers, sondern jeweils unter einer eigenen Benutzerkennung.
Auf meinem System sind derzeit zwei Virtual Hosts mit PHP-Unterstützung eingerichtet, so dass auch (mindestens) zwei Instanzen des PHP-Interpreters laufen.
# ps aux|grep php-cgi web1 9322 0.0 0.4 12044 4424 ? S 17:00 0:00 /usr/bin/php-cgi -b /var/www/example.com/tmp/php-fcgi.socket web2 9372 0.0 0.6 14200 7024 ? S 17:00 0:00 /usr/bin/php-cgi -b /var/www/wiki.example.com/tmp/php-fcgi.socketDie Anzahl der Prozesse, die PHP maximal abspaltet, wenn Bedarf danach besteht, kann mit der Umgebungsvariablen PHP_FCGI_CHILDREN bestimmt werden. Diese kann über das Webinterface cherokee-admin unter Information Sources geändert werden. Der PHP-Wrapper nimmt einen Standardwert von 5 an, wenn keine Angabe erfolgt ist.
Nach der Installation des Webservers mit PHP und zwei laufenden PHP-Interpretern sieht der Speicherverbrauch auf dem vServer Active folgendermaßen aus:
# vzfree VPS Speichernutzung: Momentan genutzt: 91.4844 MB Zugesichert: 512 MB Maximal nutzbar: 1074 MBEs ist also noch genügend Luft nach oben, wenn der Webserver zu Stoßzeiten besonders gefordert wird und mehr PHP-Interpreter gestartet werden müssen.
Über die Themen der folgenden Artikel bin ich mir noch nicht sicher. Da jeder Artikel im Prinzip einen bestimmten Dienst bzw. Dienstekomplex behandelt (wie Mailsystem, Webserver), stehen derzeit folgende Ideen im Raum:
- Nameserver
- Jabber Server - Instant Messaging
- Mumble - Voice Chat
- Ein kleiner Streamingserver für Webradio
- Java Servlet Container oder sogar ein ausgewachsener Application Server, wobei das bei dem begrenzten Speicher eher unwahrscheinlich bis unmöglich ist
- Datenbankserver (vorraussichtlich PostgreSQL) und dessen Einbindung in das Mailsystem und ggf. den Webserver

