Webhosting

PHP-FPM

Definitie

PHP-FPM (FastCGI Process Manager) is de officiële FastCGI-procesbeheerder van PHP. Hij draait groepen PHP-processen, pools genoemd, die de scripts ontvangen die de webserver (Nginx, Apache, Caddy) doorgeeft; elke pool kan een eigen systeemgebruiker, eigen limieten en een eigen php.ini hebben, waardoor sites van elkaar worden geïsoleerd.

PHP-FPM, Webhosting

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:

  • user en group: 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;
  • pm en de bijbehorende directives: het aantal workers;
  • PHP-waarden per pool, met php_value of php_admin_value. Die laatste kunnen niet vanuit een script met ini_set() worden gewijzigd.
Vergelijking van de drie modi van de directive pm in PHP-FPM. static: een vast aantal processen volgens pm.max_children, altijd klaar maar met permanent bezet geheugen, voor een server die aan één drukke site is gewijd. dynamic: pm.start_servers bij het starten, inactieve processen tussen min_spare_servers en max_spare_servers, met pm.max_children als plafond, het meest gebruikte compromis. ondemand: geen processen in rust, aangemaakt op aanvraag tot pm.max_children en gestopt na pm.process_idle_timeout, zuinig voor veel kleine sites.
De instelling pm bepaalt hoeveel PHP-processen op verzoeken wachten, en dus hoeveel geheugen bezet is.

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.

Video: “How Nginx and PHP-FPM turn a web request into code” (Chris Fidao, in het Engels)

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.

Verder lezen

  • Artikel PHP-versies die end-of-life zijn: planning, risico's en migratie

Bronnen

  1. PHP Manual: FastCGI Process Manager (FPM) (externe link, opent in een nieuw tabblad)
  2. PHP Manual: FPM configuration (externe link, opent in een nieuw tabblad)
  3. WordPress Advanced Administration: Nginx (externe link, opent in een nieuw tabblad)

Alle definities

WordPress-beveiliging, zonder ruis

Eén e-mail wanneer het ertoe doet: nieuw waargenomen aanvallen, updates van de plugin en praktische gidsen. Geen spam, afmelden met één klik.

Begin gratis, stap over op Pro wanneer je eraan toe bent

De gratis versie verbergt WordPress al en verplaatst de inlogpagina. Pro voegt aliassen, tweestapsverificatie en bewaking toe.