# Howto PHP-FPM PHP-FPM (FastCGI Process Manager) est une façon alternative d'utiliser PHP avec [Apache](HowtoApache) ou [Nginx](HowtoNginx). ## Installation ~~~ # apt install php5-fpm ~~~ ## Configuration La configuration de PHP-FPM se trouve dans `/etc/php5/fpm/php-fpm.conf`. Voici les directives de base : ~~~ [global] pid = /run/php5-fpm.pid error_log = /var/log/php5-fpm.log ~~~ On définit ensuite un ou plusieurs *pools* FPM via `/etc/php5/fpm/pool.d/*.conf` : ~~~ [www] listen = /var/run/php5-fpm.sock ;listen = 127.0.0.1:9000 user = www-data group = www-data pm = dynamic php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f return-path@example.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 ~~~ ## Configuration avancée L'option **pm** (process manager) permet de choisir comment seront contrôlés les process fils : static, ondemand ou dynamic. Le mode standard est **dynamic** : FPM va préparer des process en attente (au minimum 1) et les faire varier en fonction de la demande (de façon similaire à ce que peut faire [Apache](HowtoApache#configuration-de-base)). ~~~ pm = dynamic pm.max_children = 100 pm.start_servers = 50 pm.min_spare_servers = 20 pm.max_spare_servers = 30 pm.max_requests = 100 ~~~ Avec de nombreux pools, on optera pour le mode **ondemand** qui ne prépare pas de process mais les crée à chaque demande. D'après nos tests, les performances restent (assez étonnament) tout à fait acceptables. ~~~ pm = ondemand pm.max_children = 100 pm.process_idle_timeout = 10s ~~~ D'autres options de FPM sont intéressantes : ~~~ slowlog = log/$pool.log.slow request_slowlog_timeout = 5s pm.status_path = /fpm-status request_terminate_timeout = 60s chroot = /home/foo access.log = log/$pool.access.log ~~~ ## Configuration avec Nginx : On configure PHP-FPM avec Nginx, par exemple dans un Virtualhost : ~~~ server { listen 80; server_name www.example.com example.com; root /home/foo/www; index index.php; location ~ \.php$ { try_files $uri =404; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME /home/foo/www$fastcgi_script_name; include fastcgi_params; } } ~~~ ## Configuration avec Apache ~~~ # a2enmod proxy_fcgi Considering dependency proxy for proxy_fcgi: Enabling module proxy. Enabling module proxy_fcgi. ~~~ On configure PHP-FPM avec Apache, par exemple dans un VirtualHost : ~~~{.apache} DocumentRoot /home/bench/www/ #ProxyPassMatch "^/(.*\.php(/.*)?)$" "fcgi://127.0.0.1:9000//home/foo/www/$1" ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://localhost/home/foo/www/" ~~~