Php-fpm

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Gestionnaire de processus PHP (FastCGI)
Service php-fpm
Fichier de conf (pool) /etc/php-fpm.d/www.conf
Socket/port Unix socket ou TCP, au choix par pool
Voir aussi Modules apache · Proxy apache

PHP-FPM (FastCGI Process Manager) est une implémentation de gestionnaire de processus FastCGI pour PHP. Il remplace le mode mod_php (PHP exécuté dans le process Apache) par des processus PHP indépendants, ce qui apporte un gain de performance et de robustesse notable : les workers PHP peuvent redémarrer sans affecter le serveur web, être isolés par utilisateur/groupe pool par pool, et être placés derrière n'importe quel serveur web ou reverse proxy faisant du FastCGI.

Positionnement typique dans une chaîne de requête :

client → cache/reverse proxy (Varnish, Nginx) → Nginx/Apache → PHP-FPM → moteur PHP / SQL

Configuration d'un pool

PHP-FPM organise ses workers en pools — chacun avec son propre fichier de configuration, pouvant écouter sur un socket ou un port différent, ce qui permet d'isoler plusieurs applications sur la même machine avec des utilisateurs système distincts.

; /etc/php-fpm.d/www.conf
[www]
listen = /var/run/php-fpm/php-fpm.sock
listen.allowed_clients = 127.0.0.1
user = nginx
group = nginx

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

pm = dynamic fait varier le nombre de workers entre pm.min_spare_servers et pm.max_spare_servers selon la charge, avec un plafond dur à pm.max_children — à dimensionner en fonction de la mémoire disponible (chaque worker consomme la mémoire d'un interpréteur PHP complet).

Charger des variables d'environnement

Pour injecter un fichier de variables d'environnement dans les workers PHP-FPM (utile pour séparer la configuration applicative du code), passer par un override systemd :

# /etc/systemd/system/php-fpm.service.d/override.conf
[Service]
EnvironmentFile=/etc/monapp/environment

systemctl daemon-reload
systemctl restart php-fpm

(la source ne précisait que la ligne EnvironmentFile — le fichier override doit être placé sous une section [Service] pour être pris en compte par systemd.)

Voir aussi