- Configurer un serveur Web sous Linux – Guide complet
- Authentification SSH par clé
- Sécurisation du serveur SSH
- Sécurisation serveur – réseau et services
- Bash – paramétrage du shell
- Debian – Mise à jour du système et Dotdeb
- NTP – Synchroniser l’heure de son système avec un serveur de temps
- Installation d’Apache 2 et PHP5
- Installation de nginx – le serveur Web hautes performances
- PHP-FPM – Installation et configuration
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
Une réponse pour "PHP-FPM – Installation et configuration"
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