PHP-FPM (FastCGI Process Manager) est une interface SAPI permettant la communication entre un serveur Web et PHP. Principalement, FPM est un gestionnaire de processus FastCGI intégré à PHP, beaucoup plus efficace que celui de la SAPI FastCGI et qui permet surtout beaucoup plus d'options notamment dans le cas de l'hébergement partagé (aussi dit “mutualisé”). En effet, FPM va permettre de démarrer des processus avec des Uid/Gid différents (par site), de personnaliser des directives de php.ini par site hébergé et bien plus encore…
Prérequis :
Nous avons maintenant besoin d’installer le module « FastCGI » d’Apache. En effet, contrairement à « FCGID » (gestionnaire de processus plus moderne et souvent associé à l’installation de PHP en CGI), « FastCGI » fourni la directive permettant de préciser un gestionnaire externe de processus CGI, dans notre cas PHP5-FPM. « libapache2-mod-fastcgi » est un paquet de la section « non-free » (paquets qui ne respectent pas les DFSG). Vos sources de paquets doivent comprendre cette section pour pouvoir installer le module FastCGI. En fonction de votre distribution, remplacer lenny par squeeze au besoin.
vi /etc/apt/sources.list
deb ftp://mir1.ovh.net/debian/ lenny main contrib non-free deb-src ftp://mir1.ovh.net/debian/ lenny main contrib non-free deb http://security.debian.org/ lenny/updates main contrib non-free deb-src http://security.debian.org/ lenny/updates main contrib non-free
aptitude update aptitude install libapache2-mod-fastcgi
vi /etc/apache2/mods-enabled/fastcgi.conf
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /cgi-bin/php5.external
<Location "/cgi-bin/php5.external">
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
</Location>
</IfModule>
a2enmod actions /etc/init.d/apache2 restart
apache2ctl -M
cd /root/sources wget http://fr.php.net/distributions/php-5.3.6.tar.gz tar xzf php-5.3.6.tar.gz && cd php-5.3.6
./configure --help | grep fpm
aptitude install libgmp3-dev libcurl3-dev libmcrypt-dev libxslt1-dev libltdl7-dev
'./configure' \ '--prefix=/usr/local/php-5.3.6-fpm' \ '--disable-cli' \ '--enable-fpm' \ '--with-mysql' \ '--with-mysqli' \ '--enable-bcmath' \ '--with-zlib-dir=/usr/include/' \ '--enable-simplexml' \ '--with-xsl' \ '--with-gd' \ '--with-openssl' \ '--enable-magic-quotes' \ '--enable-exif' \ '--enable-ftp' \ '--enable-sockets' \ '--enable-shmop' \ '--enable-mbstring' \ '--enable-sysvsem' \ '--enable-sysvshm' \ '--enable-calendar' \ '--with-png-dir=/usr' \ '--with-iconv' \ '--with-jpeg-dir=/usr' \ '--with-freetype-dir=/usr' \ '--with-pdo-mysql' \ '--with-mcrypt' \ '--enable-shmop' \ '--with-gmp' \ '--with-curl' \ '--with-mhash' \ '--enable-soap' \ '--with-kerberos' \ '--enable-dba' \ '--enable-zip'
make && make install && make clean
cp sapi/fpm/init.d.php-fpm /etc/init.d/php5.3.6-fpm chmod 755 /etc/init.d/php5.3.6-fpm
cp /usr/local/php-5.3.6-fpm/etc/php-fpm.conf.default /usr/local/php-5.3.6-fpm/etc/php-fpm.conf mkdir /etc/php-5.3.6-fpm ln -s /usr/local/php-5.3.6-fpm/etc/php-fpm.conf /etc/php-5.3.6-fpm/php-conf
vi /etc/php-5.3.6-fpm/fpm.d/test1.conf
;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ;include=/etc/php-5.3.6-fpm/fpm.d/*.conf ;;;;;;;;;;;;;;;;;; ; Global Options ; ;;;;;;;;;;;;;;;;;; [global] pid = /var/run/php-5.3.6-fpm/php-fpm.pid error_log = /var/log/php-5.3.6-fpm/php-fpm.log log_level = notice emergency_restart_threshold = 10 emergency_restart_interval = 3m process_control_timeout = 5m daemonize = yes ;;;;;;;;;;;;;;;;;;;; ; Pool Definitions ; ;;;;;;;;;;;;;;;;;;;; [PHP-5.3.6-FPM] listen=/var/run/php-5.3.6-fpm/php-fpm.sock listen.backlog = -1 listen.allowed_clients = 127.0.0.1 listen.owner = php536 listen.group = php536 listen.mode = 0666 user = php536 group = php536 pm = dynamic pm.max_children = 1 pm.start_servers = 1 pm.min_spare_servers = 1 pm.max_spare_servers = 1 pm.max_requests = 500 slowlog = /var/log/php-5.3.6-fpm/$pool.log.slow rlimit_files = 1024 ;rlimit_core = 0 env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp ; Default Value: nothing is defined by default except the values in php.ini and ; specified at startup with the -d argument ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com ;php_flag[display_errors] = off ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M
mkdir /etc/php-5.3.6-fpm/fpm.d mkdir /var/run/php-5.3.6-fpm mkdir /var/log/php-5.3.6-fpm useradd --shell=/bin/false php536
vi /etc/init.d/php5.3.6-fpm
[TEST-FPM-1] # On suppose uniquement du local, mais on aurait pu # séparer les instances webserver <-> FastCGIserver listen = /var/run/php-5.3.6-fpm/test1.sock # Très pratique, cette instance lancera des processus fils # sous ces uid/gid là, rien à voir avec ceux d'Apache user = test1 group = test1 # Grande granularité sur le contrôle des processus, # ici, nous demandons une gestion dynamique pm = dynamic # Gestion dynamique des processus FastCGI pm.max_children = 5 pm.start_servers = 3 pm.min_spare_servers = 3 pm.max_spare_servers = 5 # Processus tué après avoir traité 500 requêtes pm.max_requests = 500 # L'URI de la page de statut de FPM et de ping pm.status_path = /fpm-status ping.path = /fpm-ping request_terminate_timeout = 10s request_slowlog_timeout = 10s slowlog = /var/log/php-5.3.6-fpm/test1.slow #chroot = #chdir = env[TMP] = /data/www/test1/tmp php_admin_value[error_log] = /var/log/php-5.3.6-fpm/test1-php.log php_admin_value[open_basedir]=/data/www/test1 php_admin_value[session.save_path]=/data/www/test1/tmp php_admin_value[upload_tmp_dir]=/data/www/test1/tmp #php_admin_value[inlude_path]=./ #php_admin_value[display_errors]=on
useradd -s /bin/false test1
vi /etc/apache2/sites-available/test1.local
<VirtualHost *:80>
ServerAdmin postmaster@localhost
DocumentRoot "/data/www/test1/"
ServerName test1.local
ServerAlias test1.local
ErrorLog "/var/log/apache2/test1.local.log-err"
CustomLog "/var/log/apache2/test1.local.log-access" combined
FastCgiExternalServer /data/www/test1/cgi-bin/php5.external -socket /var/run/php-5.3.6-fpm/test1.local.sock
</VirtualHost>
mkdir /data/www/test1/cgi-bin
a2ensite test1.local apacge2ctl configtest apacge2ctl graceful
Sachez qu'il existe plein d'options annexes que je vous laisse découvrir ! (mode socket ou host ….)