Aujourd’hui, j’ai changé la manière dont Apache et PHP interagissent ensemble.

Concrètement, au lieu d’utiliser la configuration par défaut du serveur Apache, c’est-à-dire le module mod_php par défaut, le serveur utilisera dorénavant mod_fastcgi (fastcgi) avec PHP-FPM (FastCGI Process Manager).

PHP : mod_php vs mod_fastcgi

La raison principale pour laquelle mod_php utilise plus de ressources réside dans le fait que le module est chargé par le serveur même lors de requêtes pour des fichiers autres que PHP, comme des fichiers HTML ou des fichiers JavaScript.

debian-apache-php-fpm

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 :

A lire :  Ubuntu : compression d'images JPG et PNG avec Trimage Image Compressor

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!

A lire :  Eliminer le cheval de troie MSN qui touche Facebook

Sommaire de la série Monter un serveur dédié de A à Z

  1. Serveur dédié : installation d’Apache, PHP, MySQL et Webmin
  2. Serveur dédié : créer la base de données MySQL et importer WordPress
  3. Serveur dédié : créer et activer un Virtual Host sous Apache
  4. Serveur dédié : changer les DNS du nom de domaine et le faire pointer vers le serveur
  5. Serveur dédié : sécurisation des services avec iptables et fail2ban
  6. Serveur dédié : sécurisation de la couche TCP/IP
  7. Serveur dédié : création d’un serveur mail Postfix (sécurisé avec Saslauthd et certificat SSL) et Courier (accès POP et IMAP) utilisant une base MySQL d’utilisateurs/domaines virtuels
  8. Serveur dédié : sécuriser Apache 2 avec ModSecurity
  9. Serveur dédié : CHMOD récursif sur des fichiers ou répertoires en ligne de commande
  10. Serveur dédié : installer APC comme système de cache et configurer Varnish comme reverse-proxy pour Apache pour améliorer les performances
  11. Serveur dédié : afficher la véritable IP derrière un reverse-proxy comme Varnish
  12. Serveur dédié : intégrer SSH à WordPress pour mettre à jour le core, les plugins et les thèmes
  13. Serveur dédié : installer la dernière version d’APC par SVN
  14. Serveur dédié : analyse des performances du serveur
  15. Serveur dédié : mettre à jour le noyau Debian de la Kimsufi
  16. Serveur dédié : sauvegarde automatique des fichiers avec Backup Manager sur le serveur de sauvegarde OVH
  17. Serveur dédié : configurer la limite mémoire pour PHP et Suhosin
  18. Bash : supprimer tous les fichiers et sous-répertoires d’un répertoire
  19. Serveur dédié : impossible de se connecter à un port distant
  20. Rsync: rapatrier les fichiers du serveur à la maison
  21. Bash : réparer les tables MySQL en cas de crash
  22. Serveur dédié : création d’une seedbox avec Transmission
  23. Serveur dédié : des paquets LAMP à jour sous Debian
  24. Serveur dédié : mise à jour vers Debian 7 Wheezy
  25. Serveur dédié : activer X11 forwarding pour SSH
  26. Serveur dédié : optimiser toutes les images JPG et PNG avec OptiPNG et JpegOptim
  27. Postfix : résoudre l’erreur “fatal: www-data(33): message file too big”
  28. Serveur dédié : mise en place de l’IPv6
  29. WordPress : accorder les bonnes permissions aux fichiers et dossiers avec chown et chmod
  30. WordPress : héberger les images sur un sous-domaine
  31. Serveur dédié : ajouter l’authentification SPF, Sender-ID et DKIM à Postfix et Bind9 avec opendkim
  32. Apache : lorsque le domaine seul (sans WWW) renvoie une erreur 403
  33. Serveur dédié : sécuriser Apache avec HTTPS (HTTP avec la couche TLS/SSL) en Perfect Forward Secrecy
  34. Serveur dédié : passer WordPress en HTTPS (TLS/SSL)
  35. Serveur dédié : configurer Webmin en TLS avec un certificat SSL
  36. Serveur dédié : configurer Transmission pour accéder au WebUI via TLS-SSL
  37. Serveur dédié : installer et configurer Varnish 4
  38. Serveur dédié : passage au mod FastCGI et PHP-FPM avec Apache MPM Worker
  39. J’ai planté le serveur… ou comment récupérer un serveur Kimsufi après un plantage de kernel avec le mode rescue OVH
  40. Serveur dédié : configurer Postfix et Courier pour utiliser TLS-SSL en Perfect Forward Secrecy
  41. Serveur dédié : retirer Varnish, devenu inutile avec HTTPS
  42. Serveur dédié : ajout de mod_spdy pour accélérer la connexion TLS-SSL sous Apache
  43. Serveur dédié : installer la dernière version d’OpenSSL sous Debian
  44. Serveur dédié : activer l’IP canonique du serveur sous Apache
  45. Serveur dédié : mise à jour vers PHP 5.6
  46. MySQL : convertir les tables MyISAM au format InnoDB
  47. Serveur dédié : optimiser toutes les images GIF avec GIFsicle
  48. Serveur dédié : migration de MySQL vers MariaDB
  49. BASH : lister, bloquer et débloquer des adresses IP avec iptables
  50. Serveur dédié : produire une meilleure réserve d’entropie avec haveged
  51. Serveur dédié : mettre en place DNSSEC pour sécuriser les DNS du domaine
  52. Serveur dédié : mise en place du protocole DANE
  53. 8 règles d’or pour bien déployer DNSSEC et DANE
  54. Serveur dédié : installer PHP7 FPM avec FastCGI sous Debian
  55. Serveur dédié : réduire les connexions TIME_WAIT des sockets et optimiser TCP
  56. Fail2Ban: protéger Postfix contre les attaques DoS de types AUTH, UNKNOWN et EHLO
  57. Serveur dédié : mettre à jour Apache et configurer le mod_http2 pour HTTP/2
  58. Serveur dédié : ajouter le domaine à la liste HSTS preload
  59. Serveur dédié : ajouter l’authentification DMARC à Postfix et BIND
  60. Serveur dédié : à la recherche de l’inode perdue ou comment résoudre le problème “no space left on device”
  61. Serveur dédié : installer NginX avec support HTTP2 et certificat SSL, PHP, MariaDB sous Debian
A lire :  Télécharger les vidéos d'Arte+7 (replay)

Pour développer votre projet WordPress ou Woocommerce, faites appel à mon expertise pour réaliser un site rapide, performant et fonctionnel.

Contactez-moi

Si vous avez trouvé une faute d’orthographe, informez-nous en sélectionnant le texte en question et en appuyant sur Ctrl + Entrée s’il vous plaît.

Articles en rapport:

Serveur dédié : passage au mod FastCGI et PHP-FPM avec Apache MPM Worker

par Matt Lecture: 5 min

Pin It on Pinterest

Share This

Spelling error report

The following text will be sent to our editors: