FastCGI Process Manager (PHP-FPM) aide à réduire l’addition des ressources système utilisées en forçant le serveur à agir comme un proxy et à ne passer que les fichiers portant l’extension php à PHP-FPM.
Ce tutoriel assume que vous avez une installation Apache/PHP sous Debian qui tourne sous mod_php
, c’est-à-dire une installation standard. Les changements prennent moins de 15 minutes.
Objectifs : gagner en rapidité d’exécution et avoir une installation plus légère. On peut ainsi envisager un jour de changer Apache pour un autre serveur tout en gardant la même configuration PHP.
Apache MPM
Apache possède trois différents Multi-Processing Modules (MPMs) qui sont en charge de se connecter aux ports de la machine, accepter les requêtes et les transmettre aux processus enfants (children processes) :
- Prefork: chaque processus enfant gère une connexion à la fois. C’est le mode par défaut sous Apache.
- Worker: utilise plusieurs processus enfants qui gèrent chacun plusieurs connexions.
- Event: ce mode a été créé pour permettre de servir plus de requêtes simultanément en délégant le temps de traitement à des processus enfants pour libérer le processus principal.
Nous sommes passés de Prefork à Worker durant la rédaction de cet article, avec des performances accrues.
Installation de mod_fastcgi et PHP-FPM
1. on vérifie que le paquet libapache2-mod-fastcgi
est disponible sur le serveur:
sudo apt-cache search libapache2-mod-fastcgi
2. si ce n’est pas le cas, la recherche ne retourne aucun résultat, cela veut dire qu’il nous manque les dépôts non-free
dans les fichiers sources d’apt
. On édite donc nos dépôts :
nano /etc/apt/sources.list
et on ajoute non-free à la fin des lignes suivantes :
deb http://mirror.ovh.net/debian/ stable main contrib non-free
deb-src http://mirror.ovh.net/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free
3. On met à jour nos dépôts :
apt-get update && apt-get upgrade
4. On installe les paquets:
apt-get install apache2-mpm-worker libapache2-mod-fastcgi php5-fpm
Configurer Apache MPM Worker
On édite la configuration du MPM Worker :
nano /etc/apache2/mods-available/mpm_worker.conf
et on modifie un peu les valeurs par défaut:
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>
Configurer Apache avec PHP-FPM
Nous allons maintenant configurer Apache pour qu’il passe toutes les requêtes pour les fichiers PHP au conteneur PHP via FastCGI.
1. On active les modules nécessaires:
a2enmod actions alias fastcgi
2. On vérifie que PHP-FPM utilise bien les sockets:
# PHP5
# grep -E '^\s*listen\s*=\s*[a-zA-Z/]+' /etc/php5/fpm/pool.d/www.conf
# PHP7
grep -E '^\s*listen\s*=\s*[a-zA-Z/]+' /etc/php/7.0/fpm/pool.d/www.conf
Cela devrait retourner la ligne suivante:
# PHP5
# listen = /var/run/php5-fpm.sock
# PHP7
listen = /run/php/php7.0-fpm.sock
ce qui est la configuration par défaut depuis PHP 5.4 mais dans le cas contraire, on édite le fichier:
# PHP5
# nano /etc/php5/fpm/pool.d/www.conf
# PHP7
nano /etc/php/7.0/fpm/pool.d/www.conf
on modifie la directive listen
avec:
# PHP5
# listen = /var/run/php5-fpm.sock
# PHP7
listen = /run/php/php7.0-fpm.sock
et on redémarre php5-fpm
:
# PHP5
# service php5-fpm restart
# PHP7
service php7.0-fpm restart
3. On édite le fichier /etc/apache2/mods-enabled/fastcgi.conf
:
nano /etc/apache2/mods-enabled/fastcgi.conf
On remplace tout le contenu du fichier par :
<IfModule mod_fastcgi.c>
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
# PHP5
# Alias /php-fcgi /usr/lib/cgi-bin/php5-fcgi
# FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -appConnTimeout 10 -idle-timeout 250 -socket /var/run/php5-fpm.sock -pass-header Authorization
# PHP7
Alias /php-fcgi /usr/lib/cgi-bin/php
FastCgiExternalServer /usr/lib/cgi-bin/php -appConnTimeout 10 -idle-timeout 250 -socket /run/php/php7.0-fpm.sock -pass-header Authorization
# Apache 2.4+
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
#
</IfModule>
Décommentez le code pour Apache 2.4+ si vous l’utilisez. Vérifiez que votre configuration ne présente aucune erreur:
apache2ctl configtest
Vous devriez obtenir le message “Syntax OK“. Sinon, re-vérifiez votre configuration.
4. Avec PHP-FPM, le fichier php.ini change ! Il se trouve désormais à cet endroit /etc/php5/fpm/php.ini
et je vous conseille d’en vérifier la configuration.
# PHP5
# nano /etc/php5/fpm/php.ini
# PHP7
nano /etc/php/7.0/fpm/php.ini
Je vous recommande d’activer la directive error_log
afin de garder une trace des erreurs PHP. Décommentez la ligne et ajoutez un chemin :
error_log = /var/log/php_errors.log
Cela évite d’envoyer les messages d’erreur PHP dans la console et d’affoler PHP-FPM avec des messages d’erreur de ce type:
FastCGI: comm with server "/usr/lib/cgi-bin/php" aborted: idle timeout (250 sec)
FastCGI: incomplete headers (0 bytes) received from server "/usr/lib/cgi-bin/php"
5. On désactive maintenant mod_php
:
a2dismod php5
6. On active mpm_worker
:
a2dismod mpm_prefork
a2enmod mpm_worker
et on redémarre PHP-FPM et Apache :
# PHP5
# service php5-fpm restart
# PHP7
service php7.0-fpm restart
service apache2 restart
Voilà, notre serveur Apache tourne désormais avec mod_fastcgi et PHP-FPM!