Archives de catégorie : PHP

Configurer Apache et PHP-FPM sous Gentoo

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/