nginx-webserver-vor-apache

Nginx vor Apache – Reverse Proxy mit Froxlor

Veröffentlicht von

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.

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.

froxlor_apache_reverse_proxy11
ab-Benchmark mit Apache 2.4

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).

froxlor_apache_reverse_proxy2
ab-Benchmark mit Nginx 1.6.2

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.

froxlor_apache_reverse_proxy3
Froxlor-Konfiguration

Bevor das oben genannte Script ausgeführt werden kann, werde ich einige Vorbereitungen am Web-Host treffen:

  1. 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_apache_reverse_proxy4
    Froxlor Webserver-Ports
  2. Nginx installieren und dessen Standardkonfiguration löschen
    apt-get install nginx
    rm /etc/nginx/sites-enabled/*
  3. 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/
  4. 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
  5. 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());
    
    ?>
    
  6. 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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.