Recherche de site Web

5 conseils pour augmenter les performances de votre serveur Web Apache


Selon un récent rapport de Netcraft (une société Internet bien connue qui fournit, entre autres services, des statistiques sur l'utilisation des navigateurs Web), Apache continue d'être le serveur Web le plus utilisé parmi les sites et les ordinateurs connectés à Internet.

De plus, Apache continue de connaître la plus forte croissance parmi les principaux serveurs Web, suivi de Nginx et IIS. Ainsi, si vous êtes un administrateur système chargé de gérer les installations Apache, vous devez savoir comment vous assurer que votre serveur Web fonctionne au mieux de ses capacités en fonction de vos besoins (ou de ceux de votre client).

Dans cet article, nous aborderons quelques conseils qui vous aideront à garantir qu'Apache fonctionnera correctement et sera capable de gérer le nombre de requêtes que vous attendez de la part de clients distants.

Cependant, gardez à l’esprit qu’Apache n’a pas été conçu dans le but d’établir des records de référence – mais, malgré cela, il est toujours capable de fournir des performances élevées dans presque tous les cas d’utilisation auxquels vous pouvez penser.

CONSEIL N°1 : Gardez toujours Apache à jour avec sa dernière version

Il va sans dire que l’installation de la dernière version d’Apache est probablement l’une des premières choses à prendre en compte. Depuis le 19 novembre 2015, la dernière version d'Apache disponible dans les dépôts CentOS 7 est la 2.4.6, alors que dans Debian est 2.4.10.

Cependant, il peut y avoir une amélioration récente ou une correction de bug qui a été ajoutée à une version stable récemment publiée, qui est ensuite disponible pour téléchargement et installation à partir des sources. Les instructions de compilation et d'installation sont également fournies ici – n'oubliez pas que si vous choisissez cette méthode de mise à jour, vous souhaiterez peut-être sauvegarder vos fichiers/sites/hôtes virtuels de configuration actuels par mesure de précaution.

Dans tous les cas, vous pouvez vérifier votre version actuellement installée comme suit :

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

En règle générale, respectez la méthode de mise à jour fournie par le gestionnaire de paquets de la distribution choisie (yum update httpd ou aptitude safe-upgrade apache2, pour CentOS ou Debian, respectivement) à moins qu'il n'y ait pas d'autre moyen. Vous pouvez lire les dernières notes de version dans la section Documentation Apache sur le site Web du projet de serveur HTTP Apache.

CONSEIL N°2 : Si vous utilisez un noyau antérieur à 2.4, envisagez de le mettre à niveau maintenant

Pourquoi? Les versions du noyau 2.4 et supérieures ont l'appel système du noyau sendfile activé par défaut. Cela, à son tour, facilite les transferts de fichiers réseau hautes performances (souhaités dans le contexte des communications serveur-client Web) et permet à Apache de fournir du contenu statique plus rapidement et avec une utilisation moindre du processeur en effectuant des opérations de lecture et d'envoi simultanées.

Vous pouvez afficher votre noyau actuellement installé avec :

uname -r

et comparez-le au dernier noyau stable sur www.kernel.org (4.3 au moment d'écrire ces lignes).

Bien qu'il ne s'agisse pas d'un processus destiné aux débutants, la mise à niveau de votre noyau est un exercice intéressant pour en savoir plus sur les composants internes de Linux.

CONSEIL N°3 : Choisissez le module multi-traitement (MPM) qui convient le mieux à votre cas

En pratique, les MPM étendent les fonctionnalités modulaires d'Apache en vous permettant de décider comment configurer le serveur Web pour qu'il se lie aux ports réseau de la machine, accepte les requêtes des clients et utilise les processus enfants (et les threads, alternativement) pour traiter de telles demandes.

À partir de la version 2.4, Apache propose trois MPM différents parmi lesquels choisir, en fonction de vos besoins :

  1. Le MPM prefork utilise plusieurs processus enfants sans thread. Chaque processus gère une connexion à la fois sans créer de threads distincts pour chacun. Sans entrer dans trop de détails, nous pouvons dire que vous souhaiterez utiliser ce MPM uniquement lors du débogage d'une application qui utilise, ou si votre application doit gérer des modules non thread-safe comme mod_php.
  2. Le MPM worker utilise plusieurs threads par processus enfants, où chaque thread gère une connexion à la fois. C'est un bon choix pour les serveurs à fort trafic car il permet de gérer davantage de connexions simultanées avec moins de RAM que dans le cas précédent.
  3. Enfin, le MPM event est le MPM par défaut dans la plupart des installations Apache pour les versions 2.4 et supérieures. Il est similaire au MPM de travail dans le sens où il crée également plusieurs threads par processus enfant mais avec un avantage : il provoque des connexions KeepAlive ou inactives (pendant qu'ils restent dans cet état). être géré par un seul thread, libérant ainsi de la mémoire qui peut être allouée à d'autres threads. Ce MPM ne convient pas à une utilisation avec des modules non thread-safe comme mod_php, pour lesquels un remplacement tel qu'un PHP-FPM doit être utilisé à la place.

Pour vérifier le MPM utilisé par votre installation Apache, vous pouvez faire :

httpd -V

L'image ci-dessous montre que ce serveur Web particulier utilise le prefork MPM.

Pour changer cela, vous devrez éditer :

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

peut être mpm_event, mpm_worker ou mpm_prefork.

et décommentez la ligne qui charge le module souhaité comme ceci :

LoadModule mpm_event_module modules/mod_mpm_event.so

Remarque : Pour que l'événement MPM fonctionne dans Debian, vous devrez peut-être installer le paquet libapache2-mod-fastcgi à partir du package non libre référentiels.

De plus, pour CentOS, vous aurez besoin de php-fpm (avec fcgi et mod_fcgid) alors que dans Debian, cela s'appelle php5-fpm< (avec apache2-mpm-event).

Enfin, redémarrez le serveur Web et le service php-fpm (ou php5-fpm) nouvellement installé :

Sur RedHat/CentOS

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

Sur Debian/Ubuntu

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Bien que vous puissiez configurer Apache pour qu'il utilise un MPM spécifique, cette configuration peut être remplacée pour chaque hôte virtuel de la même manière qu'indiqué précédemment.

Déposez simplement les balises correspondantes dans le fichier de configuration de chaque hôte virtuel et vous êtes prêt à partir, mais assurez-vous d'utiliser un et un seul MPM par hôte virtuel.

Enfin, veuillez noter que quelle que soit la distribution choisie, php-fpm repose sur l'implémentation de FastCGI, c'est la raison pour laquelle j'ai recommandé les installations de packages supplémentaires plus tôt.

Pour plus de détails et d'exemples sur php-fpm et comment il peut, avec l'événement MPM, augmenter les performances d'Apache, vous devez vous référer à la documentation officielle.

C'est ce que je vois après avoir modifié le MPM par défaut de prefork à event dans la même case affichée dans l'image précédente :

Dans CentOS 7, vous devrez vous assurer que les services http et https sont activés via le pare-feu et que la ou les interfaces réseau ) sont correctement ajoutés à la zone par défaut.

Par exemple:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

La raison pour laquelle j'en parle est parce que j'ai récemment rencontré un problème où les paramètres de configuration par défaut du pare-feu dans un VPS cloud empêchaient php-fpm et Apache de traiter les fichiers php.

Comme test de base (je suis sûr que vous pouvez penser à des tests plus compliqués ou stressants), je vais créer un fichier php qui vérifie l'existence d'un autre fichier nommé test.php dans le même répertoire de deux CentOS. 7 serveurs avec les mêmes caractéristiques matérielles et la même charge mais avec des MPM différents. L’un d’eux utilisera event et l’autre utilisera prefork :

Voici le code php que j'ai enregistré dans un fichier nommé checkiffileexists.php :

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

Ensuite, nous exécuterons l'outil de référence Apache (ab) avec 200 requêtes simultanées jusqu'à ce que 2000 requêtes soient terminées :

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

Lançons le test et comparons les résultats. Faites attention aux statistiques de performances :

Comme vous pouvez le constater, les performances du serveur avec événement sont largement supérieures à celles de son homologue prefork dans tous les aspects de ce test.

CONSEIL N°4 : Allouez judicieusement la RAM pour Apache

L'élément matériel le plus critique à prendre en compte est peut-être la quantité de RAM allouée à chaque processus Apache. Bien que vous ne puissiez pas contrôler cela directement, vous pouvez limiter le nombre de processus enfants via la directive MaxRequestWorkers (anciennement connue sous le nom de MaxClients dans Apache 2.2), ce qui imposera des limites à l'utilisation de la RAM par Apache. Encore une fois, vous pouvez définir cette valeur par hôte ou par hôte virtuel.

Pour ce faire, vous devez prendre note de la quantité moyenne de RAM utilisée par Apache, puis la multiplier par le nombre de MaxRequestWorkers, et c'est la quantité de mémoire qui sera allouée aux processus Apache. Une chose que vous ne voulez jamais que votre serveur Web fasse est de commencer à utiliser le swap, car cela diminuerait considérablement ses performances. Ainsi, vous devez toujours maintenir l'utilisation de la RAM par Apache dans les limites que vous pouvez vous permettre et ne jamais compter sur le swap pour cela.

Par exemple, le bloc suivant limitera le nombre de clients simultanés à 30. Si davantage de clients accèdent à l'hôte, ils peuvent rencontrer un retard ou une panne momentanée qui peut être facilement résolue en actualisant le navigateur. Bien que cela puisse sembler indésirable, c’est plus sain pour le serveur et, à long terme, c’est également mieux pour votre site.

Vous pouvez placer ce bloc dans /etc/httpd/conf/httpd.conf ou /etc/apache2/apache2.conf, selon que vous utilisez CentOS ou Debian.

Veuillez noter que le même principe s'applique à tous les MPM : j'utilise ici event pour poursuivre le concept décrit dans le conseil précédent :

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

Quoi qu'il en soit, il est fortement recommandé de vous référer à la documentation Apache 2.4 pour voir quelles directives sont autorisées pour le MPM choisi.

CONSEIL N°5 : Connaissez vos applications

En règle générale, vous ne devez pas charger de modules Apache qui ne sont pas strictement nécessaires au fonctionnement de votre application. Cela nécessitera au moins une connaissance globale des applications exécutées sur votre serveur, surtout si vous êtes un administrateur système et qu'il y a une autre équipe en charge du développement.

Vous pouvez lister les modules actuellement chargés avec :

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

Pour décharger/désactiver des modules dans CentOS, vous devrez commenter la ligne qui commence par LoadModule (soit dans le fichier de configuration principal, soit dans un fichier auxiliaire à l'intérieur de /etc/httpd/conf.modules.d.

D'un autre côté, Debian fournit un outil appelé a2dismod pour désactiver les modules et est utilisé comme suit :

a2dismod module_name

Pour le réactiver :

a2enmod module_name

Dans les deux cas, n'oubliez pas de redémarrer Apache pour que les modifications prennent effet.

Résumé

Dans cet article, nous avons passé en revue 5 conseils qui vous aideront à régler le serveur Web Apache et à augmenter ses performances. De plus, vous devez vous rappeler que l'optimisation et les performances sans sécurité sont inutiles, vous pouvez donc également vous référer à l'article d'installation mod_pagespeed pour améliorer les performances du serveur Web et aux conseils de renforcement d'Apache sur linux-console.net.

Comme nous ne pouvons pas couvrir de manière adéquate tous les aspects de ce sujet dans cet article, vous penserez peut-être à d’autres idées que vous aimeriez partager avec le reste de la communauté. Si tel est le cas, n'hésitez pas à nous le faire savoir en utilisant le formulaire de commentaires ci-dessous.