Ein Webserver wie Nginx kann selbst kein PHP ausführen. Er reicht jede PHP-Anfrage über das FastCGI-Protokoll an einen separaten Dienst weiter, der die Arbeit erledigt und das Ergebnis zurückgibt: Genau das ist die Aufgabe von PHP-FPM. Die PHP-Dokumentation beschreibt es als die wichtigste FastCGI-Implementierung von PHP, mit Funktionen, die vor allem stark frequentierten Websites nützen. Mit Apache ersetzt PHP-FPM das alte mod_php und wird über mod_proxy_fcgi angebunden.
So funktioniert PHP-FPM
Ein Master-Prozess liest die Konfiguration und verwaltet Kindprozesse, die Worker, die in Pools organisiert sind. Jeder Pool wird in einer eigenen Konfigurationsdatei definiert, oft eine pro Website, mit:
userundgroup: der Systemidentität der Prozesse. Zwei Websites in zwei Pools unter zwei verschiedenen Benutzern können bei korrekten Dateirechten die Dateien der jeweils anderen nicht lesen;listen: der Adresse, an der der Pool Anfragen entgegennimmt, ein Unix-Socket oder eine IP-Adresse mit Port;pmund den zugehörigen Direktiven: der Zahl der Worker;- poolspezifischen PHP-Werten über
php_valueoderphp_admin_value. Letztere lassen sich von einem Skript aus nicht mitini_set()ändern.

Die Einstellungen, auf die es ankommt
pm.max_children legt die Höchstzahl der Worker fest, also wie viele PHP-Anfragen gleichzeitig verarbeitet werden. Zu niedrig, und Besucher müssen warten; zu hoch, und dem Server geht der Arbeitsspeicher aus. Eine einfache Schätzung: den für PHP reservierten Speicher durch den durchschnittlichen Verbrauch eines Workers teilen, gemessen auf deiner eigenen Website.
pm.max_requests startet einen Worker nach einer bestimmten Zahl von Anfragen neu; die Dokumentation empfiehlt das, um Speicherlecks in Bibliotheken von Drittanbietern zu umgehen. Der Standardwert 0 bedeutet: nie neu starten.
request_slowlog_timeout und slowlog protokollieren den PHP-Aufrufstapel zu langsamer Anfragen: ein wertvolles Werkzeug, um das Plugin zu finden, das WordPress ausbremst. request_terminate_timeout beendet einen hängenden Worker, wenn max_execution_time nicht ausreicht.
Sicherheit
Die PHP-Dokumentation ist eindeutig: PHP-FPM darf niemals aus einem nicht vertrauenswürdigen Netz erreichbar sein. Ein Client, der eine FastCGI-Verbindung öffnen kann, kontrolliert die Konfiguration der Anfrage, einschließlich auto_prepend_file, und kann damit beliebigen Code ausführen. Nutze einen Unix-Socket, wenn der Webserver auf derselben Maschine läuft, und beschränke andernfalls die zugelassenen Clients mit listen.allowed_clients.
Für WordPress
- Ein Pool pro Website auf einem VPS, der mehrere WordPress-Installationen beherbergt: Ein kompromittiertes Plugin bleibt dann auf seinen Benutzer beschränkt.
- Härte PHP auf Pool-Ebene: open_basedir, deaktivierte Systemfunktionen und die weiteren Einstellungen aus unserem Leitfaden, um PHP beim Hosting abzusichern. Achtung: disable_functions lässt sich in einem Pool nur ergänzen, nicht ersetzen.
- Lade PHP-FPM neu, nachdem du die Konfiguration oder die Version geändert hast, und bleib auf einem gepflegten PHP-Zweig (siehe die PHP-Versionen am Ende ihres Lebenszyklus).
- Aktiviere OPcache: Er wird von allen Workern gemeinsam genutzt und erspart es, die Skripte bei jeder Anfrage neu zu kompilieren.
Beim Shared Hosting stellt der Hoster diese Pools für dich ein; meist kannst du nur die PHP-Version und einige PHP-Werte selbst wählen.
Häufige Fehler
PHP-FPM auf 0.0.0.0 lauschen lassen, pm.max_children so weit hochdrehen, bis der Arbeitsspeicher voll ist, alle Websites im selben Pool laufen lassen oder vergessen, den Dienst nach einer Änderung neu zu laden, und dann glauben, die Einstellung sei aktiv.