PHP : configuration de PHP-FPM

Le port de PHP 5.3.3 est disponible ! Au programme de cette nouvelle version, l’intégration de PHP-FPM, un gestionnaire de processus PHP/FastCGI.
PHP-FPM permet de gérer plusieurs pools de processus, chacun possédant ses propres règles : gestion statique/dynamique (pour s’adapter à la charge du serveur), limites mini/maxi de processus actifs/en attente, type d’écoute par socket Unix ou TCP/IP (pour déporter l’exécution sur un serveur distinct), nombre maxi de requêtes par processus avant extinction. Le redémarrage complet du pool est également supporté en cas de crash suite à une fuite mémoire. Le recours à un outil équivalent mais limité en option, tel que spawn-fcgi n’est donc plus nécessaire (référez-vous à mes articles à son sujet : ici et ici). J’oubliais l’utilisation d’un cache de code PHP tel que APC ou Xcache est possible vu que les processus php-fpm ne sont pas détruits après chaque requête.
Je vous fais part des étapes nécessaires à sa mise en place, effectuées ici sous FreeBSD 8.1 & Nginx.
Configuration de PHP
Il faut s’assurer d’activer le flag de compilation de PHP-FPM :
# cd /usr/ports/lang/php5
# make config
# make install
On oublie pas l’extension de sécurité suhosin et le cache APC :
# cd /usr/ports/security/php-suhosin
# make install
# cd /usr/ports/www/pecl-APC
# make install
Une petite vérification de routine :
# php -v
PHP 5.3.3 with Suhosin-Patch (cli) (built: Aug 9 2010 21:34:21)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
Configuration de PHP-FPM
Le module dispose de son propre fichier de configuration* /usr/local/etc/php-fpm.conf* :
[global]
pid = /var/run/php-fpm.pid
;error_log = /var/log/php-fpm.log
[www]
# socket
listen = /tmp/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0666
# user ID/GID
user = www
group = www
# pool
pm = dynamic
pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 8
Est configuré un pool de processus dynamique avec un maximum de 20 processus PHP, avec écoute par socket UNIX, le tout limité au compte utilisateur du serveur web www. Le démon peut à présent être lancé :
# echo "php_fpm_enable="YES" >> /etc/rc.conf
# /usr/local/etc/rc.d/php-fpm start
Starting php_fpm.
Le pool PHP devrait être en exécution :
# su -m www
www# ps aux|grep php
www 68220 0.6 2.3 110152 48216 ?? SJ 11:56PM 0:00.95 /usr/local/sbin/php-fpm
www 68219 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68221 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68222 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68223 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68224 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68225 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68226 0.0 0.6 99912 12540 ?? IJ 11:56PM 0:00.00 /usr/local/sbin/php-fpm
www 68402 0.0 0.1 9092 1172 1 R+J 12:00AM 0:00.00 grep php
Configuration de Nginx
Le module FastCGI doit être configuré pour utiliser le pool. J’utilise pour ce faire un fragment de configuration que j’inclue dans chaque vhost où PHP est nécessaire :
# cd /usr/local/etc/nginx/
# more fragments/php.conf
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
Le nom et le type de socket doit correspondre ici à ce qui a été déclaré dans la configuration de PHP-FPM.
# more vhosts/site_fr.conf
server {
listen 172.16.0.5:80;
server_name www.site.fr;
root /usr/local/www/site.fr/www/html;
index index.php;
location ~ \.php$ {
include fragments/php.conf;
}
}
Nginx peut enfin être redémarré :
# /usr/local/etc/rc.d/nginx restart
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Stopping nginx.
Waiting for PIDS: 89603.
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.
L’exécution des scripts PHP est à présent assurée par le pool PHP-FPM.