18
0
Fork 0
wiki/HowtoPHPFPM.md

2.8 KiB

Howto PHP-FPM

PHP-FPM (FastCGI Process Manager) est une façon alternative d'utiliser PHP avec Apache ou Nginx.

Installation

# apt install php5-fpm

Configuration

http://php.net/manual/fr/install.fpm.configuration.php

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).

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 :

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/"