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.

Si vous avez configurĂ© un reverse proxy et que vous constatez des latences, vous pouvez dĂ©terminer si le problĂšme vient de votre reverse proxy ou de votre serveur backend (celui attaquĂ© par le vhost du reverse proxy) en utilisant curl tout simplement. Pour identifier l’origine du problĂšme, il est possible de tester la connexion via le reverse proxy (RP) en ciblant directement le nom de serveur (servername) hĂ©bergĂ© sur le RP :

curl -o /dev/null -s -w "Time to first byte (TTFB): %{time_starttransfer}s\nTotal time: %{time_total}s\n" https://front.test.fr/

Ensuite, on peut effectuer le mĂȘme test en interrogeant directement le backend correspondant au vhost concernĂ© :

curl -o /dev/null -s -w "Time to first byte (TTFB): %{time_starttransfer}s\nTotal time: %{time_total}s\n" https://backend.test.fr/

En comparant les rĂ©sultats des deux requĂȘtes, il est possible de dĂ©terminer si le problĂšme de latence provient du reverse proxy ou directement du backend. Une diffĂ©rence significative de temps de rĂ©ponse entre les deux tests indiquera un goulet d’étranglement sur l’un des deux composants.

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 la consommation moyenne d’un process Apache

ps -ylC apache2 --sort:rss | awk '{sum+=$8; count++} END {print "Mémoire moyenne par process Apache:", sum/count/1024, "MB"}'

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.