Comment configurer Apache HTTP avec MPM Event et PHP-FPM sur Ubuntu 18.04

L’auteur a sélectionné le fonds de secours COVID-19 pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

Le serveur web Apache HTTP a évolué au fil des ans pour fonctionner dans différents environnements et résoudre différents besoins. Un problème important qu’Apache HTTP doit résoudre, comme tout serveur web, est de savoir comment gérer différents processus pour servir une requête au protocole http. Cela implique l’ouverture d’un socket, le traitement de la requête, le maintien de la connexion ouverte pendant une certaine période, la gestion des nouveaux événements survenant via cette connexion et le renvoi du contenu produit par un programme réalisé dans un langage particulier (tel que PHP, Perl ou Python). Ces tâches sont effectuées et contrôlées par un module multiprocesseur (MPM).

Apache HTTP est livré avec trois MPM différents :

  • Pré-fourchette : Un nouveau processus est créé pour chaque connexion entrante atteignant le serveur. Chaque processus est isolé des autres, donc aucune mémoire n’est partagée entre eux, même s’ils effectuent des appels identiques à un moment donné de leur exécution. C’est un moyen sûr d’exécuter des applications liées à des bibliothèques qui ne supportent pas le threading – typiquement des applications ou des bibliothèques plus anciennes.
  • Worker : Un processus parent est responsable du lancement d’un pool de processus enfants, dont certains sont à l’écoute de nouvelles connexions entrantes et d’autres servent le contenu demandé. Chaque processus est threadé (un seul thread peut gérer une connexion), de sorte qu’un processus peut traiter plusieurs demandes simultanément. Cette méthode de traitement des connexions favorise une meilleure utilisation des ressources, tout en maintenant la stabilité. Ceci est le résultat du pool de processus disponibles, qui a souvent des threads libres disponibles prêts à servir immédiatement les nouvelles connexions.
  • Événement : Basé sur worker, ce MPM va un peu plus loin en optimisant la façon dont le processus parent planifie les tâches vers les processus enfants et les threads associés à ceux-ci. Une connexion reste ouverte pendant 5 secondes par défaut et se ferme si aucun nouvel événement ne se produit ; c’est la valeur par défaut de la directive keep-alive, qui conserve le thread qui lui est associé. L’Event MPM permet au processus de gérer les threads de façon à ce que certains d’entre eux soient libres de gérer les nouvelles connexions entrantes tandis que d’autres restent liés aux connexions actives. Permettre la redistribution des tâches assignées aux threads permettra une meilleure utilisation des ressources et des performances.

Le module MPM Event est un module de multitraitement rapide disponible sur le serveur web HTTP Apache.

PHP-FPM est le gestionnaire de processus FastCGI pour PHP. Le protocole FastCGI est basé sur l’interface de passerelle commune (CGI), un protocole qui se situe entre les applications et les serveurs web comme Apache HTTP. Cela permet aux développeurs d’écrire des applications séparément du comportement des serveurs web. Les programmes exécutent leurs processus de manière indépendante et transmettent leur produit au serveur web par le biais de ce protocole. Chaque nouvelle connexion nécessitant un traitement par une application créera un nouveau processus.

En combinant l’événement MPM dans Apache HTTP avec le gestionnaire de processus PHP FastCGI (PHP-FPM), un site web peut se charger plus rapidement et gérer plus de connexions simultanées tout en utilisant moins de ressources.

Dans ce tutoriel, vous améliorerez les performances de la pile LAMP en changeant le module de multitraitement par défaut de pre-fork à event et en utilisant le gestionnaire de processus PHP-FPM pour gérer le code PHP au lieu du mod_php classique dans Apache HTTP.

Prérequis

Avant de commencer ce guide, vous aurez besoin des éléments suivants :

  • Un serveur Ubuntu 18.04 configuré en suivant le guide de configuration initiale du serveur Ubuntu 18.04, incluant un utilisateur sudo non root et un pare-feu.
  • La pile LAMP installée sur votre serveur en suivant Comment installer Linux, Apache, MySQL, PHP (pile LAMP) sur Ubuntu 18.04.

Etape 1 – Changer le module multiprocesseur

Ubuntu hérite des scripts pour activer ou désactiver les modules HTTP Apache de sa distribution mère, Debian. Vous utiliserez cet ensemble d’outils dans cette étape pour désactiver le module Pre-fork et activer le module Event.

Dans cette étape, vous allez arrêter Apache HTTP, désactiver le module PHP 7.2 lié au module Pre-fork, puis désactiver Pre-fork pour activer immédiatement le module Event.

D’abord, vous allez arrêter le service Apache HTTP:

  • sudo systemctl stop apache2

Vous pouvez maintenant désactiver le module PHP 7.2, qui est lié au module Pre-fork:

  • sudo a2dismod php7.2

Puis désactiver le module MPM Pre-fork :

  • sudo a2dismod mpm_prefork

Maintenant, activez le module MPM Event:

  • sudo a2enmod mpm_event

Vous avez basculé le MPM de pre-fork à event et supprimé la connexion du module PHP 7.2 entre PHP et Apache HTTP. Dans l’étape suivante, vous allez installer le module php-fpm, ainsi que les bibliothèques et les modules proxy associés. Vous configurerez Apache HTTP pour qu’il puisse également communiquer avec PHP.

Etape 2 – Configuration d’Apache HTTP pour utiliser le gestionnaire de processus FastCGI

À ce stade, vous avez changé la façon dont Apache HTTP traite les connexions en passant du MPM Pre-fork à Event. Cependant, en cours de route, vous avez désactivé le module PHP qui connectait Apache HTTP à tout programme s’exécutant sur PHP.

Dans cette étape, vous installerez le processeur PHP-FPM afin qu’Apache HTTP soit à nouveau capable de traiter les programmes PHP. Et vous installerez également les bibliothèques de dépendances et activerez les modules pour que les deux puissent coopérer en douceur et plus rapidement qu’avant.

Premièrement installer php-fpm. La commande suivante installera le paquet PHP-FPM et elle activera automatiquement le service php7.2-fpm intégré à systemd, afin que le service soit démarré au moment du démarrage :

  • sudo apt install php-fpm

Pour communiquer, Apache HTTP et PHP ont besoin d’une bibliothèque permettant cette capacité. Vous allez maintenant installer libapache2-mod-fcgid, qui est capable de servir d’interface entre les programmes avec les serveurs web, et qui est spécifique à Apache HTTP. Cette communication se fera par l’intermédiaire d’un socket UNIX.

Installer cette bibliothèque:

  • sudo apt install libapache2-mod-fcgid

Vous avez installé php-fpm et le libapache2-mod-fcgid, mais aucun n’est encore activé.

Premièrement, activez le module php-fpm avec la commande suivante:

  • sudo a2enconf php7.2-fpm

Deuxièmement, activez le module Apache HTTP proxy:

  • sudo a2enmod proxy

Troisièmement, activez le module FastCGI proxy dans Apache HTTP:

  • sudo a2enmod proxy_fcgi

Note : Vous pouvez lire la configuration de cette interaction entre les programmes PHP et Apache HTTP à travers un socket UNIX avec ce qui suit:

  • cat /etc/apache2/conf-enabled/php7.2-fpm.conf

Tout est maintenant en place pour que vous puissiez démarrer Apache HTTP. Vous ferez d’abord une vérification de la configuration:

  • sudo apachectl configtest
Output
Syntax OK

Après cela, vous pouvez procéder au redémarrage d’Apache HTTP, puisqu’il a été automatiquement démarré lors de l’installation de la bibliothèque FastCGI libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Vous avez installé le module php-fpm, configuré Apache HTTP pour qu’il fonctionne avec lui, activé les modules nécessaires au fonctionnement du protocole FastCGI et démarré les services correspondants.

Maintenant qu’Apache a le module Event MPM activé et que PHP-FPM est présent et fonctionne, il est temps de vérifier que tout fonctionne comme prévu.

Etape 3 – Vérification de votre configuration

Afin de vérifier que les changements de configuration ont été appliqués, vous allez effectuer quelques tests. Le premier vérifiera quel module multiprocesseur Apache HTTP utilise. Le second vérifiera que PHP utilise le gestionnaire FPM.

Vérifiez le serveur Apache HTTP en exécutant la commande suivante :

  • sudo apachectl -M | grep 'mpm'

Votre sortie sera la suivante :

Output
mpm_event_module (shared)

Vous pouvez répéter la même chose pour le module proxy et FastCGI :

  • sudo apachectl -M | grep 'proxy'

La sortie sera la suivante :

Output
proxy_module (shared)proxy_fcgi_module (shared)

Si vous souhaitez voir la liste complète des modules, vous pouvez supprimer la deuxième partie de la commande après -M.

Il est maintenant temps de vérifier si PHP utilise le gestionnaire de processus FastCGI. Pour ce faire, vous allez écrire un petit script PHP qui vous montrera toutes les informations relatives à PHP.

Exécutez la commande suivante pour écrire un fichier nommé comme suit :

  • sudo nano /var/www/your_domain/info.php

Ajoutez le contenu suivant dans le fichier info.php :

info.php
<?php phpinfo(); ?>

Visitez maintenant l’URL de votre serveur et ajoutez info.php à la fin comme suit : http://your_domain/info.php.

L’entrée de l’API du serveur sera FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Supprimez le fichier info.php après cette vérification afin qu’aucune information sur le serveur ne soit divulguée publiquement:

  • sudo rm /var/www/yourdomain.com/info.php

Vous avez vérifié l’état de fonctionnement du module MPM, des modules gérant le FastCGI et de la manipulation du code PHP.

Conclusion