Après avoir utilisé suEXEC et PHP en fast-CGI; je suis passé a PHP-FPM, maintenant supporté par les dernières versions de PHP. Il s’agit d’un gestionnaire de processus PHP similaire au fast-CGI, mais offrant plus de possibilités de configurations que suEXEC/fastCGI.
Avantages
Lancement de processus PHP avec des utilisateurs différents. Cette fonction est similaire à celle de suEXEC, mais d’une configuration beaucoup plus aisée (évitant notamment les problèmes de droits sur les wrappers CGI).
Définition de plusieurs pools de processus, avec des paramètres différents.
Le processus maître étant une instance de PHP lui-même, les caches d’op-code peuvent être partagés par les différents processus fils.
Installation de PHP-FPM
Il faut tout d’abord ajouter le use flag ‘fpm’ à PHP avant de le recompiler. Il est aussi nécessaire de réinsaller les modules PHP éventuellement utilisés :
# Update /etc/portage/packages.use to add fpm use flag
emerge php
emerge pecl-geoip xcache pecl-memcache suhosin -av
Afin qu’Apache puisse communiquer avec PHP-FPM, il lui faut un module fast CGI. Si mod_fastcgi ou mod_fcgid peuvent faire l’affaire, ils disposent de plus de fonctionnalités que nécessaire et sont donc plus compliqués à configurer. J’ai donc choisi mod_fastcgi_handler :
emerge www-apache/mod_fastcgi_handler -av
Il faut alors modifier le fichier ‘/etc/conf.d/apache2’ pour lui activer ce nouveau module en l’ajoutant à la liste des options APACHE2_OPTS : ‘-D FASTCGI_HANDLER’.
Configuration PHP-FPM
La configuration de la gestion des pools de processus de PHP-FPM est centralisée dans le fichier ‘/etc/php/fpm-php-5.3/php-fpm.conf’. On peut définir plusieurs pools, exécutant PHP avec des utilisateurs différents :
[poirsouille] listen=/var/run/php-fpm/poirsouille.socket user=poirsouille group=poirsouille pm = dynamic pm.max_children = 50 pm.min_spare_servers = 5 pm.max_spare_servers = 35
Le mode ‘dynamic’ permet à PHP-FPM d’ajuster automatiquement le nombre d’instances du pool à la demande.
On choisira un socket différent pour chaque pool.
Configuration Apache
Il reste à indiquer à Apache quel script fast CGI utiliser pour traiter les fichiers PHP. J’ai pu remplacer ma configuration suEXEC/mod_fcgid par celle-ci :
Use VH tech
# Ancienne configuration
#SuexecUserGroup poirsouille poirsouille
#FCGIWrapper /home/poirsouille/public_html/cgi-bin/php-fcgi .php
# PHP-FPM
AddHandler fcgi:/var/run/php-fpm/poirsouille.socket .php
On peut ainsi utiliser des pools différents selon les répertoires/virtualhosts/etc.
Démarrage
PHP-FPM est un ervice à part, qu’il faut donc ajouter au démarrage du serveur :
rc-update add php-fpm default
On peut ensuite (re)lancer PHP-FPM et Apache :
/etc/init.d/php-fpm restart
/etc/init.d/apache2 restart
Après quelques visites sur les différents sites, on constate l’apparition des processus dans les différents pools :
web ~ # ps aux |grep php-fpm
1002 9224 0.0 2.5 254380 52212 ? S 00:16 0:02 php-fpm: pool poirsouille
1002 9275 0.0 2.1 246340 43540 ? S 00:16 0:02 php-fpm: pool poirsouille
1002 9276 0.0 2.2 245420 45980 ? S 00:16 0:01 php-fpm: pool poirsouille
1002 9331 0.1 2.2 244392 45816 ? S 00:16 0:04 php-fpm: pool poirsouille
1002 9332 0.0 4.8 286808 100444 ? S 00:16 0:02 php-fpm: pool poirsouille
root 19808 0.0 0.2 235232 5168 ? Ss May27 0:02 php-fpm: master process (/etc/php/fpm-php5.3/php-fpm.conf)
apache 19809 0.0 0.5 238400 11112 ? S May27 0:00 php-fpm: pool apache
apache 19810 0.0 0.7 240260 16372 ? S May27 0:00 php-fpm: pool apache
apache 19811 0.0 0.5 240184 12172 ? S May27 0:00 php-fpm: pool apache
apache 19812 0.0 1.2 248308 26444 ? S May27 0:00 php-fpm: pool apache
apache 19813 0.0 0.5 239864 12068 ? S May27 0:00 php-fpm: pool apache
apache 19814 0.0 0.7 241912 14476 ? S May27 0:00 php-fpm: pool apache
apache 19815 0.0 0.8 241416 16864 ? S May27 0:00 php-fpm: pool apache
tibou 19819 0.0 1.2 243724 26372 ? S May27 0:00 php-fpm: pool tibou
tibou 19820 0.0 2.7 268464 56912 ? S May27 0:01 php-fpm: pool tibou
Nettoyage
Une fois le fonctionnement validé, il est possible de désinstaller les packages devenus inutiles :
emerge --depclean mod_fcgid
#Remove suexec flag and recompile apache.
Références
http://mattmcadoo.com/node/42
http://blog.myprod.net/2010/08/14/apache2-suexec-fastcgi-php-5-3-3-fpm-cache-opcode-apc/