Springe zum Inhalt

Nginx: PHP-FPM Statusseite einschalten

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.