Die freie Software Froxlor eignet sich meiner Meinung nach sehr gut, um einen Webserver-Host komfortabel zu verwalten. Als kostenlose und quelloffene Alternative zum mittlerweile fast überfrachteten Plesk nutze ich Froxlor aufgrund seiner nützlichen Features.
In einem anderen Beitrag habe ich bereits beschrieben, wie der kostenlose automatisierte Abruf von Let’s Encrypt-SSL-Zertifikaten mit Froxlor funktioniert.
Ist man jedoch wegen bestimmter Website-Features auf den Webserver Apache2 angewiesen, bieten sich mit Froxlor out-of-the-box keine Möglichkeiten, diesen Apache-Webserver mit einem Reverse Proxy zu kombinieren, um die Performance zu verbessern.
Inhalt
Nginx meistens schneller als Apache
Ohne spezielle Konfiguration mit dem mpm-event-Modul ab Apache 2.4 ist der Webserver Nginx viel schneller beim Ausliefern statischer Inhalte wie beispielsweise HTML-Seiten, CSS-Dateien oder Bilder. Ein Apache-Webserver startet für jeden Request einen eigenen Prozess, sodass ihn seine Architektur bei vielen Anfragen ressourcenintensiv und langsamer macht.
Gerade für Seiten mit hohem Trafficaufkommen ist der Nginx also gut geeignet. Das zeigen Benchmarks, die ich gegen meinen Webserver durchgeführt habe. Mit Hilfe des Tools „ab“ (ApacheBench) lassen sich leicht mehrere parallele Anfragen auf den Webserver simulieren und auswerten.
Auf dem Screenshot ist zu erkennen, dass der Apache-Webserver ca. 437 Anfragen pro Sekunde verarbeitet und ungefähr 2,3 ms für eine Anfrage benötigt.

Führt man den gleichen Benchmark gegen Nginx aus, lässt sich feststellen, dass der Webserver 1093 Anfragen pro Sekunde verarbeitet. Das sind gut doppelt so viele gegenüber dem Apache. Damit ist auch die Zeit pro Anfrage wesentlich geringer (0,9 ms).

In der Praxis hängt es sicherlich stark von der Website und der Anzahl der zu verarbeitenden Anfragen ab, ob diese Unterschiede spürbar sind.
Schnelligkeit kann jedoch nicht schaden. Deswegen würde ich gerne Nginx zum Ausliefern statischer Inhalte nutzen.
Froxlor – keine Funktionen für Reverse Proxy
Zwar kann man mit Froxlor einen Nginx als Webserver konfigurieren und einsetzen, aber meine Webseiten benötigen Funktionen, wie eine .htaccess-Datei oder das Rewrite-Modul, die einen Apache erfordern.
Bleibt also nur die Option, den Nginx-Webserver zur direkten Annahme der Anfragen zu konfigurieren und diese dann ggf. an den bestehenden Apache-Webserver weiterzuleiten. Dieses Prinzip nennt man „Reverse Proxy“.
Froxlor unterstützt eine solche Konfiguration „von Haus aus“ jedoch nicht. Hier gibt es nur ein entweder oder.
Nginx als Reverse Proxy per Script
Theoretisch wäre es möglich, Nginx einfach manuell zu konfigurieren und dabei die von Froxlor erstellten Konfigurationsdateien zu übernehmen. Änderungen in der Konfiguration der vHosts mit Froxlor würden aber nicht synchronisiert. Damit würde man also ein Stück Flexibilität verlieren.
Im Froxlor-Forum hat ein Benutzer ein Script veröffentlicht, das die Froxlor-Konfigurationen ausliest und entsprechende Nginx-vHosts anlegt. Per CronJob werden Änderungen oder neue vHosts in der Froxlor-Verwaltung aus der mySQL-Datenbank abgefragt und für Nginx übernommen.
Mittlerweile findet sich dieses Script auch auf Github. Ich habe es auf meine Installation angewendet und möchte im Folgenden kurz erklären, wie man es auf eine Apache 2.4 – Froxlor-Installation anwendet.
Vorbereitung und Ausführung
Folgender Screenshot zeigt meine Froxlor-Konfiguration. Die wesentlichen Eckpunkte sind Froxlor in der Version 0.9.38.7, Apache 2.4 und MySQL 5.5.

Bevor das oben genannte Script ausgeführt werden kann, werde ich einige Vorbereitungen am Web-Host treffen:
- Damit Nginx automatisch installiert werden kann, müssen die Ports 80 und 443 frei sein. Im Froxlor Panel unter „IPs und Ports“ werden die Ports für HTTP und HTTPS auf 8888 bzw. 8843 geändert. Spätestens nach 5 Minuten, nachdem der Froxlor-Master-Cronjob gelaufen ist, ist diese Konfiguration aktiv.
Froxlor Webserver-Ports - Nginx installieren und dessen Standardkonfiguration löschen
apt-get install nginx rm /etc/nginx/sites-enabled/*
- Script von Github herunterladen, entpacken und Dateien des scripts-Verzeichnisses in Nginx-Verzeichnis verschieben. Außerdem muss die Datei proxy.conf aus dem master-Verzeichnis nach /etc/nginx/ verschoben werden.
wget https://github.com/Ithariel/froxlor_nrp/archive/master.zip unzip master.zip mv master/scripts /etc/nginx/ mv master/proxy.conf /etc/nginx/
- Nach dem Verschieben befinden sich folgende Dateien im scripts-Verzeichnis:
cd /etc/nginx/scripts/ ls -l insgesamt 24 drwxr-xr-x 2 root root 4096 Okt 14 19:12 drwxr-xr-x 7 root root 4096 Aug 25 09:59 .. rwxr-xr-x 1 root root 6944 Aug 25 07:56 create_vhosts.php rwxr-xr-x 1 root root 2816 Aug 25 09:10 get_infos.php rwxr-xr-x 1 root root 548 Aug 25 09:15 init.php
- Die Parameter der Froxlor-Installation müssen in die Datei init.php eingetragen werden.
#!/usr/bin/php <?php define("FROXLOR_HOME", "/var/www/froxlor"); define("SCRIPT_HOME", "/etc/nginx/scripts"); define("NGINX_VHOST_PATH", "/etc/nginx/sites-enabled"); // Load Userdata require_once(FROXLOR_HOME.'/lib/userdata.inc.php'); // Set vars $froxlor_db = 'froxlor'; $froxlor_host = 'localhost'; $froxlor_user = 'froxlor'; $froxlor_pass = 'password'; // Include info functions require_once(SCRIPT_HOME.'/get_infos.php'); // Include vhost function require_once(SCRIPT_HOME.'/create_vhosts.php'); create_vhosts(getDomainInfo()); ?>
- Script ausführen und Cronjob für automatische Aktualisierung der Konfigurationen einrichten. Bei erstmaliger manueller Ausführung lassen sich ggf. Fehler leichter erkennen.
/usr/bin/php5 -q /etc/nginx/scripts/init.php
crontab -e */10 * * * * root /usr/bin/nice -n 5 /usr/bin/php5 -q /etc/nginx/scripts/init.php
Bei Ausführung des Scripts wird die Konfiguration von Froxlor aus der entsprechenden Datenbank gelesen und für Nginx die vHosts für alle vorhandenen Domains angelegt.
Jede vHost-Konfigurationsdatei enthält dabei die nötigen Einstellungen zum Caching bzw. Ausliefern von Dateien durch Nginx und damit dem Verhalten als Reverse Proxy.
Bilddateien, Javascripts und css-Dateien werden gecached und von Nginx selbst an den anfragenden Client geliefert. Bei anderen Dateien wie php-Scripts wird die Anfrage an den SSL-Port von Apache weitergereicht.
server { listen 443 ssl; server_name xxx.de www.xxx.de ; ssl on; ssl_certificate /etc/ssl/froxlor-custom/xxx.de.crt; ssl_certificate_key /etc/ssl/froxlor-custom/xxx.de.key; #ssl_client_certificate /etc/ssl/nginx/xxx.de.bundle; ssl_verify_client off; ssl_prefer_server_ciphers on; #ssl_protocols TLSv1; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; access_log /var/log/nginx/xxx.de.access.log; root /var/customers/webs/xxx/; index index.php index.html index.htm; location ~ /\.ht { deny all; } location ~* \.(js|css|gif|jpe?g|png|ico|swf)$ { expires 10d; add_header Cache-Control "public"; try_files $uri $uri/ @proxy; } location / { try_files $uri $uri/ @proxy; } location @proxy { proxy_pass https://$server_addr:8843$request_uri; include /etc/nginx/proxy.conf; } location ~ \.(php|php5|cgi|pl|htm?l)$ { proxy_pass https://$server_addr:8843$request_uri; include /etc/nginx/proxy.conf; } }
Was ist mit SSL?
Die zuvor gezeigte vHost-Konfiguration definiert einen SSL-Host. Sind in Froxlor SSL-Zertifikate für einzelne Domains hinterlegt oder werden mit dem Let’s Encrypt-Modul abgerufen, werden dessen Verzeichnisse in die vHost-Konfigurationsdatei eingetragen.
Hinweis: Ich nutze in der Datei eine angepasste Konfiguration bezüglich der gespeicherten SSL-Zertifikate und habe daher das ssl_client_certificate auskommentiert.
Somit werden auch SSL-Zertifikate zukünftig von Nginx an den Anfragenden ausgeliefert und die Verbindung auf HTTPS-Port 443 angenommen.
Zertifikatsupdate mit Let’s Encrypt-Froxlor-Modul
Problematisch wird jedoch das automatische Update der SSL-Zertifikate für die Domains mit der Let’s Encrypt Erweiterung in Froxlor. Dieser Zertifikatsabruf bzw. dessen Anforderung erfolgt nämlich auf den Ports 80 und 443, die durch Nginx bereits in Benutzung sind.
So muss Nginx vor Update der SSL-Zertifikate zunächst angehalten und nach erfolgreicher Aktualisierung wieder gestartet werden.
service nginx stop /usr/bin/php5 -q /var/www/froxlor/scripts/froxlor_master_cronjob.php --letsencrypt service nginx start