nginx: Feintuning Tips & Tricks

By | 22. Dezember 2011

Nachdem der Webserver nginx mit php-fpm läuft ist es Zeit für etwas Feintuning.

Ausgangspunkt ist ein Single-Core-Server mit nur 250MB RAM. Dieser wird als Statistikserver (PIWIK etwa 10 Webseiten) und als Testumgebung (WordPress) genutzt. Der Trafic hält sich somit in Grenzen.

Nginx Gundkonfiguration

Als erstes habe ich die Anzahl der nginx-Worker begrenzt. Optimaler Weise sollte die Anzahl der Worker = CPU Cores entsprechen. Die Anzahl der Verbindungen pro Worker kann über worker_connections =xxxx; eingestellt werden. In meinem Beispiel sind es 768.

Die Anzahl gleichzeitiger Verbindungen ergibt sich dann aus:

Anzahl der Worker * Worker-Connections = max. mögliche gleichzeitige Verbindungen
In meinem Beispiel sind es 768 Verbindungen, völlig ausreichend für eine low-trafic-Seite.
Ein weiterer wichtiger Punkt ist Keep-Alive. Dieser Wert sollte so klein wie möglich gewählt werden, aber mindestens so groß wie die Ladezeit der Webseite. 6 Sekunden sollte in meinem Fall ein guter Kompromiss sein.
/etc/nginx/nginx.conf

Cache Steuerung

Um Bandbreite zu sparen und die Reaktionszeit der Webseiten zu verbessern ist eine vernünftige Cache-Vorgabe unabdingbar. Sämtlicher statischer Inhalt soll vom Browser für 30 Tage gecacht werden:

/etc/nginx/sites-available/webseite

Für diese Requests lasse ich auch keine Logs schreiben.
Diese Werte sind für jeden V-Host einzeln zu setzten.

Rewrite für WordPress

Nun noch eine Besonderheit für WordPress. Um die Funktion Permalinks zu nutzen benötigen wir eine einfache Rewrite-Regel. Beachtet aber das das Rootverzeichniss von WordPress (da wo die index.php zu finden ist) auch das root des V-Host sein muss.

ausleiten von PHP an fastcgi (PHP-FPM):

Benchmark mit ApacheBench:

nun machen wir mal eine Bestandsaufnahme um bei weiteren Optimierungen den Erfolg prüfen zu können.
Dafür lasse ich mir mal den Text einer 591byte großen Datei ausgeben.

und jetzt das Gleiche, nur über PHP mit xcache geparst:

und jetzt noch einmal das ganze über PHP mit APC:

Wahnsinn: 4328Req/sek (txt) ,250Req/sek (php-xcache) zu 614Req/sek (php-apc)
Mit solch einem gewaltigen Unterschied hätte ich jetzt nicht gerechnet.

Jetzt habe ich das ganze mal mit einer echten WordPress-Seite (10412 bytes) getestet:
PHP-xcache: Requests per second: 1.39 [#/sec]
PHP-APC: Requests per second: 1.27 [#/sec]
PHP-APC (apc.stat = Off) :Requests per second: 1.46 [#/sec]

Mit dem PHP muss ich mich also noch einmal genauer beschäftigen!

2 thoughts on “nginx: Feintuning Tips & Tricks

  1. Paul

    Vor allem bei nginx tritt der Unterschied doch etwas mehr zu Tage. Gutes Beispiel für wie lahm PHP doch eigentlich ist ;-)
    Was mich an dem Benchmark noch interessieren würde, wäre einmal ohne OPCode Cacher. Also nginx mit „purem“ php dahinter.
    Das Problem an PHP, du kannst es einfach nicht schneller machen, außer du spawnst mehr Prozesse… Ähnlich wie mysql ab einer gewissen Größe/Belastung hilft dann nur noch horizontales skalieren und kein tunen.

    Gruß, Paul

    1. sysmek Post author

      @Paul: ein Test X-Cache gegen APC und ohne Beschleuniger werde ich demnächst mit einer WordPress-Installation durchführen. Dieser Test findet jedoch auf einen anderen Server statt, da der ursprüngliche Server wegen Hardwaredefekt getauscht wurde.
      Eventuell vergleiche ich das ganze auch noch einmal kurz gegen den Apache2. Mal sehen wie ich die Zeit dazu finde.

Comments are closed.