Aller au contenu

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.

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.

Fenêtre de terminal
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>
/etc/apache2/apache2.conf
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

Un KeepAliveTimeout court (2 à 5 s) libère rapidement les connexions inactives.

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).

Fenêtre de terminal
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/error.log
sudo journalctl -u apache2 -n 50

Format 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 …"
<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.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" detaille
CustomLog ${APACHE_LOG_DIR}/exemple.com.access.log detaille

%D est la durée de traitement en microsecondes : repérer les requêtes lentes.

LogFormat "{\"time\":\"%{%Y-%m-%dT%H:%M:%S%z}t\",\"ip\":\"%a\",\"methode\":\"%m\",\"url\":\"%U\",\"statut\":%>s,\"octets\":%B,\"duree_us\":%D}" json
CustomLog ${APACHE_LOG_DIR}/access.json json
SetEnvIf Request_URI "^/(favicon\.ico|robots\.txt)$" nolog
CustomLog ${APACHE_LOG_DIR}/exemple.com.access.log combined env=!nolog

Ubuntu installe une configuration logrotate pour Apache :

Fenêtre de terminal
cat /etc/logrotate.d/apache2
sudo logrotate -d /etc/logrotate.d/apache2 # simulation
sudo logrotate -f /etc/logrotate.d/apache2 # rotation immédiate

Elle 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.

Fenêtre de terminal
# Codes de réponse les plus fréquents
awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn
# Adresses IP les plus actives
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# Pages les plus demandées
awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# Erreurs 5xx
awk '$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 | head

Pour une analyse interactive : sudo apt install goaccess puis sudo goaccess /var/log/apache2/access.log --log-format=COMBINED.

Ubuntu active mod_status et restreint /server-status à la machine locale (/etc/apache2/mods-enabled/status.conf) :

Fenêtre de terminal
curl http://127.0.0.1/server-status?auto

Ré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.

Fenêtre de terminal
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.

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 »