Comment configurer Apache HTTP avec MPM Event et PHP-FPM sur FreeBSD 12.0

L’auteur a sélectionné l’Open Internet/Free Speech Fund 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 prennent pas en charge 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 CGI (Common Gateway Interface), 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 FAMP en changeant le module de multitraitement par défaut de pré-fork à événement et en utilisant le gestionnaire de processus PHP-FPM pour gérer le code PHP au lieu du classique mod_php dans Apache HTTP.

Prérequis

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

  • Un serveur FreeBSD 12.0 configuré en suivant ce guide.
  • La pile FAMP installée sur votre serveur en suivant ce tutoriel.
  • L’accès à un utilisateur avec des privilèges root (ou autorisé par l’utilisation de sudo) afin d’effectuer des modifications de configuration.

Etape 1 – Modification du module multiprocesseur

Vous commencerez par rechercher la directive pre-fork dans le fichier httpd.conf. Il s’agit du fichier de configuration principal d’Apache HTTP dans lequel vous pouvez activer et désactiver des modules. Vous pouvez modifier et définir des directives telles que le port d’écoute où Apache HTTP servira le contenu ou l’emplacement du contenu à afficher dans ce fichier.

Pour effectuer ces modifications, vous utiliserez le programme nl, number line, avec le drapeau -ba pour compter et numéroter les lignes afin que rien ne soit dépareillé à un stade ultérieur. Combinée avec grep, cette commande comptera d’abord toutes les lignes du fichier spécifié dans le chemin d’accès, et une fois terminée, elle cherchera la chaîne de caractères que vous recherchez.

Exécutez la commande suivante pour que le programme nl traite et numérote les lignes de httpd.conf. Ensuite, grep traitera la sortie en recherchant la chaîne de caractères donnée 'mod_mpm_prefork':

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'

Comme sortie, vous verrez quelque chose de similaire à:

Output
67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

Modifions la ligne 67 avec votre éditeur de texte. Dans ce tutoriel, vous utiliserez vi, qui est l’éditeur par défaut sur FreeBSD:

  • sudo vi +67 /usr/local/etc/apache24/httpd.conf

Apportez un symbole # au début de la ligne pour que cette ligne soit commentée, comme ceci:

/usr/local/etc/apache24/httpd.conf
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...

En ajoutant le symbole #, vous avez désactivé le module MPM pré-fork.

Maintenant vous trouverez la directive event dans le même fichier httpd.conf.

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event

Vous verrez une sortie similaire à ce qui suit :

Output
...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Maintenant vous allez enlever le symbole # à la ligne 66 pour activer le MPM d’événement :

  • sudo vi +66 /usr/local/etc/apache24/httpd.conf

La directive se lira maintenant comme suit :

/usr/local/etc/apache24/httpd.conf
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Maintenant que vous avez basculé la configuration du pré-fork MPM vers l’événement, vous pouvez supprimer le paquet mod_php73 reliant le processeur PHP à Apache HTTP, puisqu’il n’est plus nécessaire et interférera s’il reste sur le système :

  • sudo pkg remove -y mod_php73

Vérifiez que la configuration est correcte en exécutant la commande suivante pour tester :

  • sudo apachectl configtest

Si vous voyez Syntax OK dans votre sortie, vous pouvez redémarrer le serveur Apache HTTP :

  • sudo apachectl restart

Note : S’il y a d’autres connexions HTTP en cours d’exécution sur votre serveur, un redémarrage gracieux est recommandé au lieu d’un redémarrage régulier. Cela permettra de s’assurer que les utilisateurs ne sont pas repoussés, en perdant leur connexion:

  • sudo apachectl graceful

Vous avez basculé le MPM de pre-fork à event et supprimé le module mod_php73 connexion PHP à Apache HTTP. Dans l’étape suivante, vous installerez le module PHP-FPM et configurerez Apache HTTP pour qu’il puisse communiquer avec PHP plus rapidement.

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

FreeBSD dispose de plusieurs versions supportées de PHP que vous pouvez installer via le gestionnaire de paquets. Sur FreeBSD, différents binaires des diverses versions disponibles sont compilés au lieu d’en utiliser un seul comme la plupart des distributions GNU/Linux proposent dans leurs dépôts par défaut. Pour suivre les meilleures pratiques, vous utiliserez la version supportée, que vous pouvez vérifier sur la page des versions supportées de PHP.

Dans cette étape, vous ajouterez PHP-FPM comme un service en cours d’exécution à démarrer au démarrage. Vous configurerez également Apache HTTP pour qu’il fonctionne avec PHP en ajoutant une configuration dédiée pour le module ainsi qu’en activant d’autres modules dans httpd.conf.

D’abord, vous ajouterez 'php_fpm_enable=YES' au fichier /etc/rc.conf pour que le service PHP-FPM puisse démarrer. Vous ferez cela en utilisant la commande sysrc:

  • sudo sysrc php_fpm_enable="YES"

Puis vous ajouterez le module php-fpm dans le répertoire du module Apache, afin qu’il soit configuré pour être utilisé par Apache HTTP. Pour ce faire, créez le fichier suivant :

  • sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf

Ajoutez ce qui suit dans 030_php-fpm.conf:

/usr/local/etc/apache24/modules.d/030_php-fpm.conf
<IfModule proxy_fcgi_module> <IfModule dir_module> DirectoryIndex index.php </IfModule> <FilesMatch "\.(php|phtml|inc)$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch></IfModule>

Ceci indique que si le module 'proxy_fcgi' est activé ainsi que le 'dir_module', alors tous les fichiers traités correspondant aux extensions entre parenthèses doivent être gérés par le gestionnaire de processus FastCGI exécuté sur la machine locale via le port 9000-comme si la machine locale était un serveur proxy. C’est là que le module PHP-FPM et Apache HTTP s’interconnectent. Pour y parvenir, vous activerez d’autres modules au cours de cette étape.

Pour activer le module proxy, vous allez d’abord le rechercher dans le fichier httpd.conf:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so

Vous verrez une sortie similaire à ce qui suit :

Output
...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...

Vous décommenterez la ligne en retirant le symbole #:

  • sudo vi +129 /usr/local/etc/apache24/httpd.conf

La ligne aura l’aspect suivant une fois éditée:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_module libexec/apache24/mod_proxy.so...

Maintenant vous pouvez activer le module FastCGI. Trouvez le module avec la commande suivante:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so

Vous verrez quelque chose de similaire à ce qui suit:

Output
...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Décommentez maintenant la ligne 133 comme vous l’avez déjà fait avec les autres modules:

  • sudo vi +133 /usr/local/etc/apache24/httpd.conf

Vous laisserez la ligne comme suit:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Une fois ceci fait, vous démarrerez le service PHP-FPM :

  • sudo service php-fpm start

Et vous redémarrerez Apache pour qu’il charge les derniers changements de configuration intégrant le module PHP :

  • sudo apachectl restart

Vous avez installé le module PHP-FPM, configuré Apache HTTP pour qu’il fonctionne avec, 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 cela, vous allez écrire un tout petit script PHP qui vous montrera toutes les informations relatives à PHP.

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

  • sudo vi /usr/local/www/apache24/data/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_server_IP_address/info.php.

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

PHP Screen the Server API entry FPM/FastCGI

N’oubliez pas de supprimer le fichier info.php après cette vérification afin qu’aucune information sur le serveur ne soit divulguée publiquement.

  • sudo rm /usr/local/www/apache24/data/info.php

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

Conclusion

Leave a Reply