Comment configurer Apache et PHP pour des sites Web à fort trafic sur un serveur Linux

Quasiment tous les tutoriels sur la façon d’installer la pile LAMP (Linux, Apache, MySQL, PHP) recommandent d’utiliser le module Apache intégré pour traiter les scripts PHP. Par exemple, sur Ubuntu, vous activeriez cela lorsque vous utilisez une commande telle que sudo apt install libapache2-mod-php pour installer un package. Cela obligerait à son tour Apache à utiliser mpm_prefork. Chaque fois qu’un visiteur accède à votre site Web, un nouveau processus sera lancé pour gérer cette connexion. Cela fonctionne bien lorsque le trafic est faible.
Mais cela devient un énorme problème si vous recevez une brusque montée de trafic. Par exemple, un post Reddit peut inclure votre site, et si le post devient populaire, vous pouvez avoir des milliers de visiteurs en quelques minutes.
Dans un scénario idéal, si Apache est capable de gérer la montée de trafic, certains visiteurs malchanceux devront peut-être attendre trente à soixante secondes avant que la page ne soit chargée, ce qui est absurde dans le monde d’aujourd’hui. Dans le pire des cas, le serveur commencera à ralentir gravement, et certaines connexions seront tout simplement abandonnées par manque de ressources. Dans ce cas, les visiteurs verront une erreur dans leurs navigateurs.
Ce n’est pas un bon scénario dans tous les cas, car vous avez potentiellement perdu l’attention de centaines ou de milliers de lecteurs, clients ou fans intéressés.
Malheureusement, PHP est un énorme consommateur de ressources de toute façon. Mais, avec mpm_event, Apache peut gérer les brusques montées de trafic de manière beaucoup plus efficace. Il est toutefois recommandé que votre serveur ait au moins 2 Go de RAM et 2 cœurs de CPU, réels ou virtuels, et même plus si vous vous attendez à des pics de trafic intenses, tels que plus de dix visiteurs par seconde. Si vous utilisez un serveur privé virtuel, ajoutez plus de cœurs de CPU virtuels à votre situation et du stockage SSD. La RAM est secondaire.
À lire aussi : Nginx vs Apache : Lequel vous sert le mieux ?
Comment utiliser Apache MPM Event et PHP-FPM sur les distributions basées sur Debian
Sur Debian, Ubuntu ou d’autres distributions de cette famille, évitez simplement d’installer le package “libapache2-mod-php”. Lorsque vous installez Apache, il utilise MPM event par défaut. Mais lors de l’installation du package mentionné, un script désactive MPM event et active MPM prefork. Le module PHP d’Apache ne peut fonctionner (sûrement) qu’avec mpm_prefork. Bien sûr, sans “libapache2-mod-php”, vous n’avez pas de processeur pour les fichiers PHP. Vous utiliserez donc PHP-FPM à la place du module PHP inclus dans Apache. Voici comment vous installeriez une pile LAMP sur un serveur frais. Vous pouvez adapter les étapes en fonction des exigences de votre application Web.
Tout d’abord, connectez-vous en tant que root. Ensuite, installez Apache.
apt update && apt install apache2À ce stade, vous pouvez voir qu’Apache est en effet livré avec MPM event activé par défaut.
apachectl-V
Installez PHP-FPM.
apt install php-fpmVous verrez des instructions sur la façon d’activer le processeur PHP dans Apache.

Activez le protocole FastCGI.
a2enmod proxy_fcgiActivez la configuration par défaut de PHP-FPM pour Apache.
a2enconf php7.0-fpmRemarque : dans les futures versions de Debian/Ubuntu, cette commande pourrait changer pour quelque chose d’autre, par exemple a2enconf php7.6-fpm, car PHP-FPM serait d’une version différente.
Redémarrez Apache.
systemctl restart apache2Installez le reste de vos exigences pour votre application PHP. Voici un exemple :
apt install mariadb-server php-mysqlCela installerait un serveur de base de données et le module PHP MySQL afin que votre application PHP puisse se connecter à une base de données.
À lire aussi : Comment se protéger contre les DDoS avec Mod_evasive sur le serveur Apache
Comment utiliser Apache MPM Event et PHP-FPM sur les distributions basées sur RedHat
L’autre choix de distribution serveur populaire est RedHat ou CentOS. De la même manière que ci-dessus, un exemple d’une installation propre d’Apache avec MPM event activé et PHP-FPM sera proposé.
Connectez-vous en tant que root et installez Apache.
yum install httpdContrairement aux distributions basées sur Debian, ici vous verrez qu’Apache utilise MPM prefork par défaut, du moins sur le dernier CentOS 7 disponible au moment de l’écriture.
apachectl-V
Pour activer MPM event, vous devez modifier un fichier de configuration.
sed-i'/mpm_prefork\.so$/s/^/#/'/etc/httpd/conf.modules.d/00-mpm.confCela ajoutera un signe # pour commenter (inactiver) la ligne LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

Maintenant, décommentez (activez) la ligne #LoadModule mpm_event_module modules/mod_mpm_event.so en supprimant le signe # précédent avec la commande suivante.
sed-i'/mpm_event\.so$/s/^#//'/etc/httpd/conf.modules.d/00-mpm.confDémarrez Apache et activez-le pour qu’il se lance automatiquement au démarrage.
systemctl start httpd.service
systemctl enable httpd.serviceVérifiez si Apache utilise maintenant MPM event.
apachectl-V
Installez PHP-FPM et le module FastCGI.
yum install php-fpm mod_fcgidCréez “/etc/httpd/conf.d/php.conf” pour indiquer à Apache comment traiter les fichiers PHP. Copiez TOUT le contenu ci-dessous, et collez-le d’un coup dans le terminal, puis appuyez sur ENTRER.
cat</etc/httpd/conf.d/php.conf
# Rediriger vers local php-fpm si mod_php n'est pas disponible
# Activer les en-têtes d'autorisation http
SetEnvIfNoCase ^Authorization$ "(.+)"HTTP_AUTHORIZATION=$1
IfModule>
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
SetHandler "proxy:fcgi://127.0.0.1:9000"
FilesMatch>
# Refuser l'accès aux sources php brutes par défaut
# Pour réactiver, il est recommandé d'activer l'accès aux fichiers
# seulement dans un hôte virtuel ou un répertoire spécifique
Require all denied
FilesMatch>
# Refuser l'accès aux fichiers sans nom de fichier (par exemple, '.php')
Require all denied
FilesMatch>
IfModule>
IfModule>
PASTE Le crédit pour cette excellente configuration revient à Debian. D’autres sources recommandent un fichier de configuration simple tel que :
SetHandler "proxy:fcgi://127.0.0.1:9000"
Mais cela est vulnérable à certaines attaques, et si certains services échouent, vous pouvez exposer des fichiers PHP au public, exposant ainsi potentiellement des mots de passe stockés, du code et des données sensibles.
Redémarrez Apache.
systemctl restart httpd.serviceDémarrez PHP-FPM et activez son démarrage automatique au démarrage.
systemctl start php-fpm.service
systemctl enable php-fpm.serviceConclusion
Vous avez maintenant un serveur Apache qui évolue beaucoup mieux avec le trafic. Cependant, rappelez-vous que vous utilisez les paramètres par défaut, ce qui est “le mieux” pour la plupart des gens. Si vous voulez vraiment tirer le meilleur parti de votre serveur HTTP, vous devez lire sur les différentes variables que vous pouvez régler. Les bonnes valeurs pour celles-ci dépendent fortement des ressources de votre serveur, du trafic attendu et de l’application PHP.