Gegenüber Apache ist Nginx ein reiner Datenauslieferer. Anwendungen werden hier nicht wie beim Apache als Module geladen, sondern müssen als eigenständige Prozesse, über FastCGI erreichbar, bereitgestellt werden. Um PHP bereitzustellen kann PHP-FPM verwendet werden. Über FastCGI kann es entweder über einen Unix-Socket oder per TCP/IP angesprochen werden und mit Nginx kommunizieren.
Um die Serverlast im Auge zu behalten kennt man unter Apache die vom Modul mod_status bereitgestellt Statusseite. Unter Nginx kann mit stub_status on; ebenfalls an entsprechender Stelle eine Statusseite eingeschaltet werden. Für PHP-FPM müssen mehre Einstellungen vorgenommen werden.
Zuerst einmal muss in PHP-FPM festgelegt werden, unter welcher URL bzw. dessen Pfad die Statusseite ausgegeben werden soll. Diese wird in der Konfigurationsdatei des jeweiligen PHP-FPM-Pools eingetragen. Unter Debian heißt der Standard-Pool www und die entsprechende Konfiguration befindet sich in /etc/php5/fpm/pool.d/www.conf.
pm.status_path = /fpmstatus
Ich verwende hier /fpmstatus, da eindeutiger und das vorgegebene /status bei mir schon belegt war.
Anschließend muss in Nginx festgelegt werden, dass dieser Pfad an PHP-FPM weitergeleitet wird.
location ~ ^/fpm(status|ping)$ { access_log off; allow 127.0.0.1; allow ::1; deny all; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php5-fpm.sock; }
Hier wird festgelegt, dass die Pfade /fpmstatus und /fpmping an PHP-FPM weitergeleitet werden und nur ein Zugriff von localhost auf diese Pfade zulässig ist.
Nach einem Neustart von Nginx und PHP-FPM kann nun auf die entsprechende URL zugegriffen werden:
$ GET 'http://localhost/fpmstatus' pool: www process manager: dynamic start time: 20/Jul/2016:17:26:54 +0200 start since: 17936 accepted conn: 5044 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 2 active processes: 1 total processes: 3 max active processes: 5 max children reached: 4 slow requests: 0
Die ausgegebenen Werte bedeuten im einzelnen:
start time | Zeitpunkt, wann PHP-FPM gestartet wurde |
start since | Anzahl der Sekunden seit dem Start von PHP-FPM |
accepted conn | Anzahl der akzeptierten Verbindungen |
listen queue | Anzahl der wartenden Anfragen in der Warteschlange. Sollte hier ein Wert größer 0 auftauchen, so sollte die Anzahl der FPM-Prozesse erhöht werden. |
max listen queue | die Maximalanzahl der jemals in der Warteschlange wartenden Anfragen |
listen queue len | die Größe der Warteschlange |
idle processes | Anzahl der unbeschäftigten Prozesse |
active processes | Anzahl der Prozesse, die aktuell Anfragen bearbeiten |
total processes | Gesamtanzahl der Prozesse, Summe aus beiden vorgenannten Werten |
max active processes | Maximalanzahl der jemals gleichzeitig aktiven Prozesse |
max children reached | Anzahl, wie oft die maximale Anzahl der gleichzeitig aktiven Prozesse erreicht wurde. Steht hier eine Zahl größer 0 sollte die Maximalanzahl der Prozesse erhöht werden. |
slow request | sofern die Auswertung von "slow requests" in FPM eingeschaltet ist, wird hier angezeigt, wie oft solche slow requests aufgetreten sind |
Erweiterte Statistiken für alle FPM-Prozesse lassen sich ebenfalls ausgeben:
# GET 'http://localhost/fpmstatus?full' pool: www process manager: dynamic start time: 20/Jul/2016:17:26:54 +0200 start since: 18855 accepted conn: 5224 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 2 active processes: 1 total processes: 3 max active processes: 5 max children reached: 4 slow requests: 0 ************************ pid: 29335 state: Running start time: 20/Jul/2016:20:56:52 +0200 start since: 6257 requests: 6447 request duration: 96 request method: GET request URI: /fpmstatus?full content length: 0 user: - script: - last request cpu: 0.00 last request memory: 0 ...
Hier wird für jeden FPM-Prozess unter anderem angezeigt, welche URL er gerade bearbeitet und wie viele Anfragen er insgesammt seit dem Start schon verarbeitet hat.
Die Statusseite kann auch in anderen Formaten ausgegen werden:
- http://localhost/fpmstatus
- http://localhost/fpmstatus?json
- http://localhost/fpmstatus?html
- http://localhost/fpmstatus?xml
Die erweiterte Statusseite versteht die unterschiedlichen Ausgabeformate ebenfalls:
- http://localhost/fpmstatus?full
- http://localhost/fpmstatus?json&full
- http://localhost/fpmstatus?html&full
- http://localhost/fpmstatus?xml&full
Besonders die XML- und JSON-Ausgabe lassen sich einfach weiterverarbeiten. Die HTML-Ausgabe kann auf entsprechende Webseiten eingebunden werden.