Früher lief PHP häufig als Modul direkt im Webserver. Heute trennen die meisten Installationen beides: Der Webserver kümmert sich um Verbindungen, Verschlüsselung und statische Dateien, PHP-FPM führt die PHP-Skripte aus. Die Kommunikation läuft über das FastCGI-Protokoll. Das PHP-Handbuch beschreibt FPM als FastCGI-Implementierung mit Funktionen, die vor allem für stark belastete Websites nützlich sind.
Wie PHP-FPM funktioniert
Ein Hauptprozess startet und überwacht die Arbeitsprozesse. Diese sind in Pools organisiert. Laut PHP-Handbuch kann jeder Pool unter einem eigenen Benutzer und einer eigenen Gruppe laufen, auf einem eigenen Port oder Socket lauschen und eigene php.ini-Werte verwenden. Damit lassen sich mehrere Websites auf einem Server sauber voneinander trennen.
Der Webserver leitet Anfragen für PHP-Dateien an den passenden Pool weiter, bei nginx etwa über die Direktive fastcgi_pass, bei Apache über das Modul mod_proxy_fcgi. Ein freier Arbeitsprozess führt das Skript aus und gibt die Antwort zurück.
Weitere Funktionen laut Handbuch:
- geordnetes Beenden und Neustarten von Prozessen
- ein „Slowlog“, das bei ungewöhnlich langsamen Anfragen den PHP-Aufrufstapel protokolliert
- eine Statusseite mit Ausgaben in JSON, XML oder OpenMetrics
- die Funktion
fastcgi_finish_request(), die die Antwort an den Browser abschließt, während das Skript im Hintergrund weiterarbeitet
Prozesssteuerung
Die Einstellung pm legt fest, wie Arbeitsprozesse entstehen:
- static: eine feste Anzahl an Prozessen, festgelegt mit
pm.max_children - dynamic: eine Anzahl zwischen Mindest- und Höchstwert an Reserveprozessen
- ondemand: Prozesse starten erst bei Bedarf und beenden sich nach einer Leerlaufzeit, standardmäßig nach zehn Sekunden
pm.max_children begrenzt die Zahl der gleichzeitig bearbeiteten Anfragen und sollte zum verfügbaren Arbeitsspeicher passen. Mit pm.max_requests wird ein Prozess nach einer bestimmten Zahl an Anfragen neu gestartet, was gegen Speicherlecks in Bibliotheken hilft. request_terminate_timeout beendet Anfragen, die zu lange laufen.
Typische Einsatzszenarien
- nginx mit PHP-FPM als Grundlage für Content-Management-Systeme, Shops oder Frameworks wie Laravel
- ein Server mit mehreren Websites, jede in einem eigenen Pool mit eigenem Benutzer
- Container, in denen Webserver und PHP-FPM getrennt laufen und skaliert werden
Sicherheit
- Socket statt offenem Port: Laufen Webserver und PHP-FPM auf demselben Rechner, empfiehlt das PHP-Handbuch einen Unix-Socket. Begründung laut Handbuch: Ein offen erreichbarer FastCGI-Endpunkt erlaubt das Ausführen beliebigen Codes.
- TCP absichern: Wird TCP verwendet, mit
listen.allowed_clientsnur die Adressen der Webserver zulassen und den Port per Firewall sperren. Ohne diese Einstellung nimmt PHP-FPM Verbindungen von jeder Adresse an. - Ein Pool je Anwendung: Jede Website unter einem eigenen Benutzer mit minimalen Rechten betreiben, nach Least Privilege. Eine kompromittierte Anwendung erreicht dann nicht die Dateien der anderen.
- Ausführbare Endungen begrenzen:
security.limit_extensionssteht standardmäßig auf.php .pharund sollte nicht erweitert werden, damit hochgeladene Dateien anderer Typen nicht als Code laufen. - Statusseite schützen: Die Statusseite nur intern oder mit Anmeldung erreichbar machen.
- Version verbergen: Den Header
X-Powered-Bymitexpose_php = Offoder im Webserver entfernen. Der Security-Header-Generator der TOMORIS Toolbox erzeugt die passenden Zeilen für nginx und Apache. - Aktuell bleiben: PHP-FPM gehört zur jeweiligen PHP-Version und erhält mit ihr Sicherheitsupdates, siehe PHP End of Life.
Leistung und Betrieb
Die Zahl der Prozesse ergibt sich aus dem Arbeitsspeicher je Prozess und dem verfügbaren Speicher des Servers. Statusseite und Slowlog zeigen, ob Anfragen warten oder einzelne Skripte bremsen. Zusammen mit OPcache entscheidet die Pool-Konfiguration maßgeblich über Antwortzeiten. Änderungen an der Konfiguration erfordern ein Neuladen des Dienstes und sollten als geplante Änderung erfolgen.
Abgrenzung
CGI startet für jede Anfrage einen neuen Prozess, FastCGI hält Prozesse dauerhaft bereit. PHP-FPM ist die Prozessverwaltung von PHP für FastCGI. Das Apache-Modul mod_php führt PHP dagegen direkt im Webserverprozess aus. Die PHP-Kommandozeile (CLI) ist unabhängig von PHP-FPM und hat eigene Einstellungen.