Apache : performances et journaux
Régler la compression, le cache et les processus, puis lire les journaux pour diagnostiquer. Les exemples utilisent des noms génériques.
Compression : mod_deflate
Section intitulée « Compression : mod_deflate »Le module est actif par défaut sur Ubuntu, pour les types texte courants (/etc/apache2/mods-enabled/deflate.conf). Pour ajouter des types :
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain text/css text/xml AddOutputFilterByType DEFLATE application/json application/javascript application/xml AddOutputFilterByType DEFLATE image/svg+xml DeflateCompressionLevel 5</IfModule>- Ne pas compresser les images JPEG, PNG, vidéos et archives (déjà compressées).
- Le niveau 4 à 6 est un bon compromis.
Vérifier : curl -sI -H "Accept-Encoding: gzip" https://exemple.com/style.css | grep -i content-encoding.
Cache navigateur
Section intitulée « Cache navigateur »sudo a2enmod headers# Fichiers dont le nom change à chaque version (empreinte) : un an<FilesMatch "\.(css|js|woff2|svg|png|jpg|jpeg|webp|avif|ico)$"> Header set Cache-Control "public, max-age=31536000, immutable"</FilesMatch>
# Pages HTML : toujours revalider<FilesMatch "\.html$"> Header set Cache-Control "no-cache"</FilesMatch>KeepAlive
Section intitulée « KeepAlive »KeepAlive OnMaxKeepAliveRequests 200KeepAliveTimeout 5Un KeepAliveTimeout court (2 à 5 s) libère rapidement les connexions inactives.
MPM event : processus et connexions
Section intitulée « MPM event : processus et connexions »Ubuntu utilise le MPM event par défaut. Réglages dans /etc/apache2/mods-available/mpm_event.conf :
<IfModule mpm_event_module> StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 150 MaxConnectionsPerChild 0</IfModule>| Directive | Rôle |
|---|---|
MaxRequestWorkers |
Nombre maximal de requêtes traitées simultanément (processus × threads) |
ThreadsPerChild |
Threads par processus |
MaxConnectionsPerChild |
Recyclage d’un processus après N connexions (0 : jamais) |
Adapter MaxRequestWorkers à la mémoire : mémoire disponible ÷ mémoire par processus. Voir l’état avec mod_status. Le MPM actif s’affiche avec apache2ctl -V | grep -i mpm.
HTTP/2 multiplie les échanges sur une connexion : sudo a2enmod http2 puis Protocols h2 http/1.1 (voir HTTPS et certificats). Il exige le MPM event : ne pas utiliser libapache2-mod-php (qui impose prefork).
Journaux
Section intitulée « Journaux »sudo tail -f /var/log/apache2/access.logsudo tail -f /var/log/apache2/error.logsudo journalctl -u apache2 -n 50Format combined d’une ligne d’accès :
203.0.113.5 - - [05/Oct/2026:14:30:00 +0200] "GET /page HTTP/1.1" 200 1234 "-" "Mozilla/5.0 …"Un journal par site
Section intitulée « Un journal par site »<VirtualHost *:80> ErrorLog ${APACHE_LOG_DIR}/exemple.com.error.log CustomLog ${APACHE_LOG_DIR}/exemple.com.access.log combined LogLevel warn</VirtualHost>LogLevel |
Contenu |
|---|---|
crit, error, warn |
Problèmes (warn par défaut) |
notice, info |
Informations de fonctionnement |
debug, trace1 à trace8 |
Diagnostic très détaillé (volumineux, à activer brièvement) |
Niveau précis par module : LogLevel warn ssl:info rewrite:trace3.
Format enrichi, avec durée
Section intitulée « Format enrichi, avec durée »LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" detailleCustomLog ${APACHE_LOG_DIR}/exemple.com.access.log detaille%D est la durée de traitement en microsecondes : repérer les requêtes lentes.
Format JSON
Section intitulée « Format JSON »LogFormat "{\"time\":\"%{%Y-%m-%dT%H:%M:%S%z}t\",\"ip\":\"%a\",\"methode\":\"%m\",\"url\":\"%U\",\"statut\":%>s,\"octets\":%B,\"duree_us\":%D}" jsonCustomLog ${APACHE_LOG_DIR}/access.json jsonRéduire le bruit
Section intitulée « Réduire le bruit »SetEnvIf Request_URI "^/(favicon\.ico|robots\.txt)$" nologCustomLog ${APACHE_LOG_DIR}/exemple.com.access.log combined env=!nologRotation des journaux
Section intitulée « Rotation des journaux »Ubuntu installe une configuration logrotate pour Apache :
cat /etc/logrotate.d/apache2sudo logrotate -d /etc/logrotate.d/apache2 # simulationsudo logrotate -f /etc/logrotate.d/apache2 # rotation immédiateElle fait tourner les journaux chaque semaine (14 archives) et recharge Apache. Elle couvre /var/log/apache2/*.log : les journaux de sites nommés ainsi sont inclus.
Analyser les journaux
Section intitulée « Analyser les journaux »# Codes de réponse les plus fréquentsawk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn
# Adresses IP les plus activesawk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# Pages les plus demandéesawk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# Erreurs 5xxawk '$9 ~ /^5/' /var/log/apache2/access.log | tail -20
# Requêtes de plus d'une seconde (format « detaille » : dernier champ en microsecondes)awk '$NF > 1000000 {print $NF, $7}' /var/log/apache2/exemple.com.access.log | sort -rn | headPour une analyse interactive : sudo apt install goaccess puis sudo goaccess /var/log/apache2/access.log --log-format=COMBINED.
Surveiller : mod_status
Section intitulée « Surveiller : mod_status »Ubuntu active mod_status et restreint /server-status à la machine locale (/etc/apache2/mods-enabled/status.conf) :
curl http://127.0.0.1/server-status?autoRésultat : requêtes par seconde, processus occupés et libres, durée de fonctionnement. Pour l’exposer à une supervision, adapter Require local à l’adresse autorisée ; ne jamais l’ouvrir au public.
curl -o /dev/null -s -w "dns=%{time_namelookup} connexion=%{time_connect} tls=%{time_appconnect} premier_octet=%{time_starttransfer} total=%{time_total}\n" https://exemple.com/ab -n 1000 -c 20 https://exemple.com/ # test de charge simple (à lancer sur son propre serveur)ab est fourni par le paquet apache2-utils.
Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
server reached MaxRequestWorkers setting |
Augmenter MaxRequestWorkers (en vérifiant la mémoire) ou réduire KeepAliveTimeout |
| Mémoire saturée | Réduire MaxRequestWorkers, MaxConnectionsPerChild non nul, vérifier les modules chargés |
| Disque plein à cause des journaux | Vérifier logrotate, du -sh /var/log/apache2 |
| Page lente | %D dans les journaux : application lente ou réseau |
| Les fichiers compressés ne le sont pas | Type absent de AddOutputFilterByType, ou module deflate désactivé |
| Contenu ancien après déploiement | Cache navigateur (immutable sur des noms non versionnés) |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Pour aller plus loin
Section intitulée « Pour aller plus loin »- Documentation : Performance Tuning et Log Files
- Retour : Installation