Cet article fait partie de la série Installer un serveur Web - Guide Complet - Article 10 sur 10

PHP-FPM (FastCGI Process Manager) est une implémentation de PHP FastCGI apportant de nouvelles fonctionnalités et intégré depuis PHP 5.3.3.

 

Pour ceux qui ne savent pas ce qu’est FastCGI, il s’agit d’une variante de CGI (Common Gateway Interface) permettant la communication entre un serveur Web et un autre logiciel (ici PHP).
En CGI, un processus est exécuté à chaque nouvelle requête et un nouvel environnement d’exécution est créé à chaque fois. Cette approche peut vite devenir pénalisante pour les performances, c’est pourquoi FastCGI a choisi de s’appuyer sur un nombre déterminé de processus pour traiter toutes les requêtes.

Avec PHP-FPM, c’est la même logique qui est appliquée avec quelques avantages ou fonctionnalités supplémentaires :
• Une création dynamique des processus (en fonction de la charge),
• Des statistiques (du même genre que celles de mod_status),
• Une gestion avancée des processus avec des arrêts/démarrages « graceful » (termine les requêtes en cours),
• Restriction sur les adresses IP pouvant être à l’origine des requêtes,
• La possibilité de démarrer les processus sous différents uid/gid, sous des racines différentes (chroot), des environnements différents et avec différents php.ini : vos applications pourront donc réellement être indépendantes,
• Logging de Stdout & stderr, et logging de type « slowlog » pour les requêtes longues,
• …
Apache possède un module pour PHP, permettant de se passer des implémentations en CGI ou FCGI. Pour nginx par contre, l’arrivée d’une solution comme PHP-FPM est une aubaine et forme un duo parfait.

Installation

L’installation de PHP5-FPM est largement facilitée si celui-ci est intégré au gestionnaire de paquets. C’est le cas si vous avez correctement ajouté le dépôt dotdeb à vos sources comme décrit dans l’article « Mise à jour du système et Dotdeb ».
Commencez donc par là si ce n’est pas déjà fait. Par exemple pour Debian Squeeze, on ajoute les lignes suivantes à /etc/apt/sources.list :

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

L’installation de PHP5-FPM s’effectue alors comme ceci :

apt-get -y install php5-fpm

Pour PHP, j’installe ensuite les paquets supplémentaires suivants :

apt-get -y install php5-gd php5-curl php5-mysql php5-imagick php5-mcrypt

La liste des paquets supplémentaires est bien sûr à adapter à vos besoins, sachant qu’il est possible d’ajouter ou de retirer des composants à tout moment.
Lorsque vous installez des logiciels PHP répandus, la documentation indique presque toujours les paquets obligatoires ou optionnels.

Configuration

La configuration propre à PHP5-FPM se fait dans le fichier /etc/php5/fpm/php5-fpm.conf.

Autrefois sous format XML, les développeurs ont changé d’avis pour revenir à un fichier plat (type fichier ini), et ce n’est pas plus mal.

Vous avez la possibilité de créer plusieurs pools dans ce fichier, en commençant une nouvelle section avec le nom du pool entre crochets.

[POOL]

Les paramètres importants sont alors les suivants :

listen : permet de préciser l’interface d’écoute ou le socket unix utilisé :

Pour le port par défaut 9000 :

listen                 = 127.0.0.1:9000

listen.allowed_clients permet de limiter les clients autorisés à certaines adresses IP.

listen.allowed_clients = 127.0.0.1

Pour utiliser un socket Unix :

listen                 = '/path/to/unix/socket'

Le socket est représenté comme un simple fichier sur le système (sous Linux/Unix, tout est fichier), et permet d’interfacer des processus entre eux sans passer par la couche réseau du système, qui est inutile lorsque les différents processus sont hébergés sur le même serveur.

Dans ce cas, les deux processus en question (ici le serveur Web et PHP-FPM devront avoir les droits d’accès sur ce fichier).

L’utilisateur et le groupe du processus est précisé avec les paramètres user et group :

user  = www-data
group = www-data

Dans le cas de l’utilisation d’un socket unix, il est possible de préciser l’utilisateur, le groupe et le mode qu’aura le fichier représentant le socket avec les variables listen.owner, listen.group et listen.mode :

listen.owner = www-data
listen.group = www-data
listen.mode = 0666

Viennent ensuite les paramètres qui vont contrôler la création et la suppression des processus de PHP-FPM.
Il faut tout d’abord choisir entre deux modes : static et dynamic.
En static, le nombre de processus fils est fixe et correspond à la valeur de pm.max_children.

pm = static
pm.max_children = 10

En dynamic, pm.max_children est le nombre maximum de processus, pm.start_servers le nombre au démarrage, pm.min_spare_servers le nombre minimum de processus inactifs, pm.max_spare_servers le nombre maximum de processus inactifs.

pm                   = dynamic
pm.max_children      =  30
pm.start_servers     =  10
pm.min_spare_servers =   5
pm.max_spare_servers =  30

pm.max_requests est le nombre maximum de requêtes que traitera un processus avant d’être recréé.

pm.status_path indique l’URL qui sera utilisée pour obtenir le statut du processus (à la mod_status) :

pm.status_path = /status

slowlog permet de loguer les requêtes qui dépassent request_slowlog_timeout :

request_slowlog_timeout = 30
slowlog = /var/log/php5-fpm.log.slow

Pour redémarrer le serveur, il suffit alors de taper la commande :

/etc/init.d/php5-fpm restart

ou pour seulement recharger la configuration :

/etc/init.d/php5-fpm reload

PHP-FPM avec nginx

Nginx intègre par défaut le paramétrage nécessaire pour fonctionner en FCGI. La configuration est présente dans le fichier /etc/nginx/fastcgi.conf (ou /etc/nginx/fastcgi_params).

Dans cette configuration, on peut se passer complètement d’Apache, nginx traitant tous les fichiers statiques et passant la main à PHP-FPM pour les fichiers dynamiques (en PHP).

Pour traiter les fichiers PHP, il faudra ajouter dans la configuration de vos sites des lignes du type :

location ~ \.php$ {
  include /etc/nginx/fastcgi_params;
  fastcgi_pass  127.0.0.1:9000;
}

Cette configuration indique à tous les fichiers portant l’extension .php d’utiliser le fichier de configuration cité au dessus, et le processus PHP-FPM écoutant sur le même serveur et sur le port 9000.

On peut bien sûr personnaliser cette configuration, voici un second exemple :

location / {
  fastcgi_pass   unix:/path/to/unix/socket;
  fastcgi_index  index.php;
 
  fastcgi_param  SCRIPT_FILENAME  /var/www/$fastcgi_script_name;
  fastcgi_param  QUERY_STRING     $query_string;
  fastcgi_param  REQUEST_METHOD   $request_method;
  fastcgi_param  CONTENT_TYPE     $content_type;
  fastcgi_param  CONTENT_LENGTH   $content_length;
}

On utilise ici un socket unix et on paramètre le chemin d’appel passé à PHP.

Voici un exemple utilisant un cache :

http {
  fastcgi_cache_path   /path/to/cache  levels=1:2
                       keys_zone=NAME:10m
                       inactive=5m;
 
  server {
    location / {
      fastcgi_pass    127.0.0.1:9000;
      fastcgi_cache   NAME;
      fastcgi_cache_valid   200 302  1h;
      fastcgi_cache_valid   301      1d;
      fastcgi_cache_valid   any      1m;
      fastcgi_cache_min_uses  1;
      fastcgi_cache_use_stale error  timeout invalid_header http_500;
    }
  }

Pour un premier essai, la configuration la plus simple est souvent la meilleure. Une fois que vous aurez trouvé vos marques, il suffira d’appliquer systématiquement la même recette, et cela deviendra vite un jeu d’enfant! ou presque ;)

PHP-FPM.

Navigation<< Installation de nginx – le serveur Web hautes performances >>

 


 

Une réponse pour "PHP-FPM – Installation et configuration"

  1. Sup'Man  Surfe sur Google Chrome Google Chrome 27.0.1453.94 avec Windows Windows 7
    29 mai 2013 @ 13:44
    1

    Bonjour,
    J’ai nginx qui fait reverse proxy,
    je voudrais savoir comment faire passer du php sous du fcgi
    sachant que le site n’est pas sur le même serveur que le nginx.

    Avec cette methode :
    location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    }

    Le documentroot est celui par défaut, donc celui de la config nginx
    comment faire pour pointer vers un document root distant

PapyGeek a fini Super Mario Bros en 2 secondes, Bowser est venu s'excuser et lui a rendu la princesse, il est mort quand même... +