Hébergement web

PHP-FPM

Définition

PHP-FPM (FastCGI Process Manager) est le gestionnaire de processus FastCGI officiel de PHP. Il fait tourner des groupes de processus PHP, appelés pools, qui reçoivent les scripts transmis par le serveur web (Nginx, Apache, Caddy) ; chaque pool peut avoir son utilisateur système, ses limites et son php.ini, ce qui isole les sites entre eux.

PHP-FPM, Hébergement web

Un serveur web comme Nginx ne sait pas exécuter PHP. Il transmet chaque requête PHP, selon le protocole FastCGI, à un service séparé qui fait le travail et renvoie le résultat : c’est le rôle de PHP-FPM. La documentation de PHP le décrit comme l’implémentation FastCGI principale de PHP, avec des fonctions surtout utiles aux sites très sollicités. Avec Apache, PHP-FPM remplace l’ancien mod_php et s’utilise via mod_proxy_fcgi.

Comment fonctionne PHP-FPM

Un processus maître lit la configuration et gère des processus enfants, les workers, regroupés en pools. Chaque pool est défini dans un fichier de configuration, souvent un par site, avec :

  • user et group : l’identité système des processus. Deux sites dans deux pools sous deux utilisateurs différents ne peuvent pas lire les fichiers l’un de l’autre si les permissions sont correctes ;
  • listen : l’adresse où le pool attend les requêtes, socket Unix ou adresse IP et port ;
  • pm et ses directives : le nombre de workers ;
  • des valeurs PHP propres au pool, avec php_value ou php_admin_value. Ces dernières ne peuvent pas être modifiées par ini_set() depuis un script.
Comparatif des trois modes de gestion des processus de PHP-FPM. static : nombre fixe de processus égal à pm.max_children, toujours prêts mais mémoire occupée en permanence, adapté à un serveur dédié à un site chargé. dynamic : pm.start_servers au démarrage, entre pm.min_spare_servers et pm.max_spare_servers processus inactifs, plafond pm.max_children, le compromis courant. ondemand : aucun processus au repos, création à la demande jusqu’à pm.max_children, arrêt après pm.process_idle_timeout, économe pour de nombreux petits sites.
Le réglage pm décide combien de processus PHP attendent les requêtes, et donc la mémoire occupée.

Les réglages qui comptent

pm.max_children fixe le nombre maximal de workers, donc de requêtes PHP traitées en même temps. Trop bas, les visiteurs attendent ; trop haut, le serveur manque de mémoire. Une estimation simple consiste à diviser la mémoire réservée à PHP par la consommation moyenne d’un worker, mesurée sur votre site.

pm.max_requests relance un worker après un certain nombre de requêtes ; la documentation le conseille pour contourner les fuites de mémoire de bibliothèques tierces. La valeur par défaut, 0, ne relance jamais.

request_slowlog_timeout et slowlog enregistrent la pile d’appels PHP des requêtes trop lentes : un outil précieux pour trouver l’extension qui ralentit WordPress. request_terminate_timeout tue un worker bloqué quand max_execution_time ne suffit pas.

Vidéo : « How Nginx and PHP-FPM turn a web request into code » (Chris Fidao, en anglais)

Sécurité

La documentation de PHP est catégorique : PHP-FPM ne doit jamais être joignable depuis un réseau non fiable. Un client capable d’ouvrir une connexion FastCGI contrôle la configuration de la requête, y compris auto_prepend_file, et peut donc exécuter du code arbitraire. Préférez un socket Unix quand le serveur web tourne sur la même machine, et restreignez sinon les clients autorisés avec listen.allowed_clients.

Pour WordPress

  • Un pool par site sur un VPS qui héberge plusieurs WordPress : une extension compromise reste confinée à son utilisateur.
  • Durcissez PHP au niveau du pool : open_basedir, désactivation des fonctions système et autres réglages de notre guide pour durcir PHP sur un hébergement. Attention, disable_functions ne peut être que complété dans un pool, pas remplacé.
  • Rechargez PHP-FPM après un changement de configuration ou de version, et gardez une branche de PHP maintenue (voir les versions de PHP en fin de vie).
  • Activez OPcache : il est partagé entre les workers et évite de recompiler les scripts à chaque requête.

En hébergement mutualisé, l’hébergeur règle ces pools pour vous ; seul le choix de la version et de quelques valeurs PHP vous est en général ouvert.

Erreurs fréquentes

Laisser PHP-FPM écouter sur 0.0.0.0, gonfler pm.max_children jusqu’à faire saturer la mémoire, faire tourner tous les sites dans un même pool, ou oublier de recharger le service après une modification et croire que le réglage est actif.

Pour aller plus loin

  • Article Versions de PHP en fin de vie : calendrier, risques et migration

Sources

  1. PHP Manual : FastCGI Process Manager (FPM) (lien externe, nouvel onglet)
  2. PHP Manual : FPM configuration (lien externe, nouvel onglet)
  3. WordPress Advanced Administration : Nginx (lien externe, nouvel onglet)

Toutes les définitions

La sécurité WordPress, sans le bruit

Un e-mail quand ça compte : nouvelles attaques observées, mises à jour de l’extension et guides pratiques. Pas de spam, désinscription en un clic.

Commencez gratuitement, passez à Pro quand vous êtes prêt

La version gratuite masque déjà WordPress et déplace la page de connexion. Pro ajoute alias, double authentification et surveillance.