nginx + PHP unter Debian (+ W3TC)

nginx ist ein schneller Webserver, der sich auch als Reverse Proxy oder zum Streaming von Flash-Videos einsetzen lässt. Ursprünglich entwickelt für die Anforderungen einer russischen Suchmaschine setzen auch immer mehr Webprojekte auf nginx. Anders als beim bekannten Apache-Webserver ist die Konfiguration von nginx unter Debian nicht ganz so simpel – es müssen noch Dateien von hand angepasst werden. Dieser Beitrag beschreibt die Basis-Änderungen, die nötig sind, um PHP5 mit Xcache als FastCGI-Einbindung unter Debian zum laufen zu kriegen. Die gezeigten Einstellungen sollten immer an die eigene Umgebung angepasst werden.

Installation
Mit folgendem Befehl werden die passenden Pakete installiert:

apt-get install php5-cgi php5-xcache php5-mysql nginx

Der mysql-Server ist in unserem Fall auf einem anderen Server untergebracht, ansonsten müsste zusätzliche noch das entsprechende Paket installiert werden. Der nächste Schritt ist die Einrichtung des nginx, wir behaltet dort weitgehenden den Debian-Standard bei. Mit dem Befehlt

/etc/init.d/nginx start

wird überprüft ob die Konfiguration bis hier hin funktioniert und der Webserver korrekt startet.

Konfiguration

Ist dies der Fall, müssen noch einige Anpassungen an der PHP-Einstellung für den jeweiligen Host sein (der Default-Host wird in „/etc/nginx/sites-available/default“ konfiguriert).

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; #php läuft auf Localhost, Port 9000
#fastcgi_index index.php; #wird für diese Konfiguration nicht benötigt
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; #legt das Verzeichnis fest
include /etc/nginx/fastcgi_params;
}

In der fastcgi_params, die von Debian unter /etc/nginx angelegt wird, muss ebenfalls noch etwas geändert werden. Folgende Zeilen müssen auskommentiert werden:

#fastcgi_param SCRIPT_NAME $document_root$fastcgi_script_name;

Jetzt kann php-cgi alleine gestartet werden, um zu schauen ob alles funktioniert:

php-cgi -b 127.0.0.1:9000

Eine php-info-Datei in /var/www sollte jetzt Informationen zum installieren PHP zurückliefern. Gibt es die Meldung „no input file specified“ stimmt noch etwas mit den Verzeichnissen nicht. Funktioniert alles, kann das php-cgi-Startscript aus dem Nginx-Wiki übernommen werden und Einstellungen am XCache etc. vorgenommen werden. auch sollten wie im Wiki beschrieben Upload-Verzeichnisse geschützt werden, damit dort kein PHP ausgeführt werden kann.

Demnächst geht es hier weiter mit Redirects unter Nginx und Klartext-URLs mit WordPress (wie sie dieser Blog auch schon verwendet).

Für WordPress gibt es mit W3TC ein wirklich gutes Plugin, welches verschiedene Mechanismen bereitstellt/aktiviert, welche die Auslieferung von WordPress signifikant beschleunigen. Dieses Plugin funktioniert auch mit nginx, allerdings muss hierbei die Rewrite-Konfiguration angepasst werden (W3TC stellt hierzu passende Informationen bereit). „Minify“ für CSS und JS hat auf dieser Seite allerdings dazu geführt, dass einige Grafiken nicht geladen wurden – die Fehlersuche dauert noch an, bis dahin bleibt trotzdem ein deutlicher Geschwindigkeits-Vorteil. Apache-Bench zeigt entsprechende Werte, die für einen vServer recht gut aussehen:

Complete requests: 1500
Requests per second: 91.20 [#/sec] (mean)
Time per request: 10.965 [ms] (mean)
Transfer rate: 4084.89 [Kbytes/sec] received

Werde in den nächsten Tagen schauen, ob es sich noch weiter optimieren lässt.