Een webserver als Nginx kan PHP niet uitvoeren. Hij geeft elk PHP-verzoek via het FastCGI-protocol door aan een aparte dienst die het werk doet en het resultaat terugstuurt: dat is de rol van PHP-FPM. De PHP-documentatie beschrijft het als de belangrijkste FastCGI-implementatie van PHP, met functies die vooral nuttig zijn voor drukbezochte sites. Bij Apache vervangt PHP-FPM het oude mod_php en wordt het gebruikt via mod_proxy_fcgi.
Hoe PHP-FPM werkt
Een masterproces leest de configuratie en beheert childprocessen, de workers, die in pools zijn gegroepeerd. Elke pool wordt gedefinieerd in een configuratiebestand, vaak één per site, met:
userengroup: de systeemidentiteit van de processen. Twee sites in twee pools onder twee verschillende gebruikers kunnen elkaars bestanden niet lezen als de rechten goed staan;listen: het adres waarop de pool verzoeken verwacht, een Unix-socket of een IP-adres met poort;pmen de bijbehorende directives: het aantal workers;- PHP-waarden per pool, met
php_valueofphp_admin_value. Die laatste kunnen niet vanuit een script metini_set()worden gewijzigd.

De instellingen die ertoe doen
pm.max_children legt het maximale aantal workers vast, en dus het aantal PHP-verzoeken dat tegelijk wordt verwerkt. Te laag en bezoekers moeten wachten; te hoog en de server komt geheugen tekort. Een eenvoudige schatting: deel het geheugen dat voor PHP is gereserveerd door het gemiddelde verbruik van een worker, gemeten op je eigen site.
pm.max_requests herstart een worker na een bepaald aantal verzoeken; de documentatie raadt dat aan om geheugenlekken in externe bibliotheken te omzeilen. De standaardwaarde, 0, herstart nooit.
request_slowlog_timeout en slowlog leggen de PHP-call stack vast van verzoeken die te traag zijn: een waardevol hulpmiddel om de plugin te vinden die WordPress vertraagt. request_terminate_timeout beëindigt een vastgelopen worker als max_execution_time niet volstaat.
Beveiliging
De PHP-documentatie is stellig: PHP-FPM mag nooit bereikbaar zijn vanaf een onbetrouwbaar netwerk. Een client die een FastCGI-verbinding kan openen, bepaalt de configuratie van het verzoek, inclusief auto_prepend_file, en kan dus willekeurige code uitvoeren. Kies voor een Unix-socket als de webserver op dezelfde machine draait, en beperk anders de toegestane clients met listen.allowed_clients.
Voor WordPress
- Eén pool per site op een VPS met meerdere WordPress-sites: een gehackte plugin blijft beperkt tot zijn eigen gebruiker.
- Hard PHP op poolniveau: open_basedir, het uitschakelen van systeemfuncties en de andere instellingen uit onze gids om PHP te harden op een hostingpakket. Let op: disable_functions kun je in een pool alleen aanvullen, niet vervangen.
- Herlaad PHP-FPM na een wijziging van de configuratie of de versie, en houd een PHP-versie aan die nog wordt onderhouden (zie de PHP-versies die end-of-life zijn).
- Schakel OPcache in: het wordt gedeeld door de workers en voorkomt dat scripts bij elk verzoek opnieuw worden gecompileerd.
Bij shared hosting stelt de hoster deze pools voor je in; meestal kies je alleen de versie en een paar PHP-waarden.
Veelgemaakte fouten
PHP-FPM laten luisteren op 0.0.0.0, pm.max_children zo ver opdrijven dat het geheugen volloopt, alle sites in één pool laten draaien, of vergeten de dienst na een wijziging te herladen en denken dat de instelling actief is.