Diagnostic et optimisation d’Apache

Apache HTTP Server est l’un des serveurs web les plus utilisés au monde. Cependant, une mauvaise configuration peut entraîner des ralentissements et une consommation excessive de ressources. Cet article vous guidera à travers un processus détaillé pour diagnostiquer les performances de votre serveur Apache et optimiser sa configuration en fonction des caractéristiques de votre machine.

1. Identifier les caractéristiques du serveur

Avant d’optimiser Apache, il est essentiel de connaître les ressources disponibles sur votre serveur.

Vérifier la mémoire RAM

free -h

Ce qui vous donnera un retour du type :

total        used        free      shared  buff/cache   available
Mem:           4.0G        1.5G        500M        200M        2.0G        2.2G

L’important ici est de noter la mémoire disponible.

Vérifier le CPU

lscpu

Ce qui affichera des informations comme :

Architecture:        x86_64
CPU(s):              2
Thread(s) per core:  1
Core(s) per socket:  2

Ce qui nous permet de voir que nous avons 2 CPU physiques.

Vérifier la charge système

top -n 1 | head -n 10

Ou avec une moyenne sur 15 minutes :

uptime

Si la charge est supérieure au nombre de CPU, cela indique une surcharge.

2. Analyser la charge d’Apache

Vérifier le nombre de connexions actives

netstat -anp | grep ":80 " | wc -l
netstat -anp | grep ":443 " | wc -l

Cela vous donne une idée du nombre de connexions en cours sur HTTP et HTTPS.

Vérifier les requêtes en temps réel

tail -f /var/log/apache2/access.log

Ou encore :

awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -20

Cela permet d’identifier les IP qui génèrent le plus de trafic.

3. Optimisation d’Apache selon les ressources disponibles

La configuration d’Apache dépend du module MPM (Multi-Processing Module) utilisé. Le choix du bon MPM est crucial. Pour les serveurs modernes, mpm_event est recommandé car il gère mieux les connexions simultanées.

Modifier la configuration MPM

Pour un serveur 2 vCPU et 4 Go de RAM

Éditez /etc/apache2/mods-enabled/mpm_event.conf :

<IfModule mpm_event_module>
    ThreadLimit             64
    StartServers             4
    MinSpareThreads         75
    MaxSpareThreads        150
    ThreadsPerChild         25
    MaxRequestWorkers       300
    MaxConnectionsPerChild  10000
</IfModule>

Explication :

  • StartServers: Nombre initial de processus Apache.
  • MinSpareThreads et MaxSpareThreads: Ajustent les threads disponibles en attente de requêtes.
  • ThreadsPerChild: Nombre de threads par processus.
  • MaxRequestWorkers: Nombre maximal de requêtes simultanées.
  • MaxConnectionsPerChild: Redémarrage périodique des processus pour libérer la mémoire.

Calcul des valeurs optimales

Les paramètres MaxRequestWorkers et ThreadsPerChild doivent être ajustés selon la RAM disponible.

Mode de calcul :
  1. Déterminer la mémoire consommée par un processus Apache : ps -ylC apache2 --sort:rss | awk '{sum+=$8} END {print sum/NR/1024 " MB"}'
  2. Supposons que chaque processus utilise 40 Mo de RAM et que vous avez 4 Go de RAM :
    • Il faut laisser de la mémoire pour le système et autres services. Par exemple, 1 Go réservé.
    • RAM disponible pour Apache : 3 Go = 3072 Mo.
    • Nombre de MaxRequestWorkers optimal : 3072 / 40 ≈ 76.

Ainsi, ajuster MaxRequestWorkers autour de cette valeur pour éviter une surcharge mémoire.

Optimisation des limites système avec ulimit

L’outil ulimit permet de définir et d’ajuster les limites des ressources système allouées aux processus sous Linux, y compris Apache. Ces paramètres impactent directement la performance et la stabilité du serveur, en contrôlant le nombre maximal de fichiers ouverts (nofile), le nombre de processus utilisateur (nproc), la taille de la pile (stack), et bien d’autres.

Vérifier les limites actuelles

Pour connaître les limites appliquées à Apache, utilisez :

sudo su - www-data -s /bin/bash -c 'ulimit -a'

ou directement :

ulimit -a

Éléments clés à optimiser :

  • nofile (Nombre maximal de fichiers ouverts)
    Une valeur trop basse peut entraîner des erreurs Too many open files, notamment pour les connexions simultanées gérées par Apache. ulimit -n 65535 🔹 Solution permanente : Ajoutez dans /etc/security/limits.conf : www-data soft nofile 65535 www-data hard nofile 65535
  • nproc (Nombre maximal de processus par utilisateur)
    Si trop faible, Apache peut être limité dans sa capacité à créer de nouveaux workers. ulimit -u 65535
  • stack (Taille de la pile par thread)
    Une valeur trop basse peut provoquer des plantages sur des applications gourmandes. ulimit -s 8192

Appliquer les changements en live

Si vous souhaitez modifier ces valeurs sans redémarrer le serveur :

ulimit -n 65535
ulimit -u 65535

Toutefois, ces changements seront réinitialisés après un redémarrage. Pour les rendre persistants, configurez-les dans /etc/security/limits.conf et /etc/systemd/system/apache2.service.d/override.conf.

En ajustant ces paramètres de manière adéquate, vous évitez des limitations artificielles qui pourraient brider la performance d’Apache sous forte charge. 🚀

Activer la compression

Ajoutez ou modifiez /etc/apache2/mods-available/deflate.conf :

<IfModule mod_deflate.c>
        <IfModule mod_filter.c>
                AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
                AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
                AddOutputFilterByType DEFLATE application/rss+xml
                AddOutputFilterByType DEFLATE application/wasm
                AddOutputFilterByType DEFLATE application/xml
        </IfModule>
</IfModule>

Puis activez-le :

a2enmod deflate
systemctl restart apache2

Activer la mise en cache

Modifiez /etc/apache2/mods-available/expires.conf :

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 month"
</IfModule>

Activez-le :

a2enmod expires
systemctl restart apache2

Ajuster KeepAlive

Le Keep-Alive permet aux connexions HTTP de rester ouvertes, améliorant ainsi la rapidité des requêtes.

Dans /etc/apache2/apache2.conf, ajoutez ou modifiez :

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

Cela permet de maintenir les connexions ouvertes et d’éviter les surcharges CPU.

Note : Il est possible de mettre MaxKeepAliveRequests 0 si le serveur a beaucoup de ressources ou si un reverse proxy interne dans une zone sécurisée (évitant toute attaque type flooding) afin d’éviter toute limitation artificielle.

Activer les protocoles HTTP/2 et HTTP/1.1

L’activation de HTTP/2 permet une meilleure gestion des connexions simultanées et une latence réduite.

Ajoutez la directive suivante dans votre configuration Apache (/etc/apache2/apache2.conf) :

Protocols h2 http/1.1

Puis redémarrez Apache :

systemctl restart apache2

Limiter les connexions par IP avec mod_qos

Pour installer mod_qos :

apt install libapache2-mod-qos

Si un site consomme trop de ressources, limitez le nombre de connexions par IP :

<IfModule qos_module>
  QS_SrvMaxConn 300
  QS_SrvMaxConnPerIP 20
  QS_EventPerSecLimit QS_Event 20
</IfModule>

Puis activez le module :

a2enmod qos
systemctl restart apache2

4. Surveiller et ajuster en fonction de la charge

Installer Apache Benchmark (ab)

apt install apache2-utils

Puis tester la charge avec :

ab -n 1000 -c 100 http://localhost/

Cela envoie 1000 requêtes avec 100 connexions simultanées pour voir comment Apache répond.

Surveiller l’occupation mémoire d’Apache

ps aux | grep apache2

Ou :

htop

Cela permet de voir si les processus Apache consomment trop de ressources.

Activer les logs de performance

Dans /etc/apache2/conf-available/logging.conf :

LogLevel info
CustomLog /var/log/apache2/access.log combined

Puis :

a2enconf logging
systemctl restart apache2

Conclusion

L’optimisation d’Apache repose sur une bonne compréhension des ressources de votre serveur et un ajustement progressif des paramètres. En appliquant ces recommandations, vous améliorez la réactivité et la stabilité de votre serveur web tout en réduisant la consommation de ressources.