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.
Table of Contents
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
etMaxSpareThreads
: 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 :
- 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"}'
- 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 erreursToo 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.