Aller au contenu

Nginx : 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.

Dans le contexte http (/etc/nginx/nginx.conf) :

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types
text/plain text/css text/xml
application/json application/javascript application/xml
image/svg+xml;
  • gzip on est déjà actif dans le nginx.conf d’Ubuntu, mais seulement pour text/html : gzip_types ajoute les autres types.
  • Ne pas compresser les images JPEG, PNG, vidéos et archives (déjà compressées).
  • gzip_comp_level : 4 à 6 est un bon compromis.

Vérifier : curl -sI -H "Accept-Encoding: gzip" https://exemple.com/style.css | grep -i content-encoding.

# Fichiers dont le nom change à chaque version (empreinte) : un an
location ~* \.(?:css|js|woff2|svg|png|jpg|jpeg|webp|avif|ico)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
access_log off;
}
# Pages HTML : toujours revalider
location ~* \.html$ {
add_header Cache-Control "no-cache";
}
/etc/nginx/nginx.conf
worker_processes auto; # un processus par cœur de processeur
events {
worker_connections 4096; # connexions par processus
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30s;
keepalive_requests 1000;
types_hash_max_size 2048;
}

La limite de fichiers ouverts du processus doit suivre :

worker_rlimit_nofile 16384; # contexte principal
Directive Rôle
worker_processes auto Autant de processus que de cœurs
worker_connections Connexions simultanées par processus (total = processus × connexions)
sendfile on Envoi des fichiers par le noyau, sans copie en mémoire
keepalive_timeout Durée de maintien d’une connexion pour réutilisation
open_file_cache max=2000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

Utile pour les sites qui servent beaucoup de fichiers statiques.

HTTP/2 multiplie les échanges sur une connexion (voir la syntaxe selon la version dans HTTPS et certificats). HTTP/3 (QUIC) est disponible à partir de Nginx 1.25 : il demande un module et une configuration spécifique (listen 443 quic reuseport;) et l’ouverture du port UDP 443.

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

Format par défaut 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 …"
server {
access_log /var/log/nginx/exemple.com.access.log;
error_log /var/log/nginx/exemple.com.error.log warn;
}
Niveau d’error_log Contenu
crit, error, warn Problèmes (error par défaut)
notice, info Informations de fonctionnement
debug Diagnostic très détaillé (volumineux, à activer brièvement)
# Contexte http
log_format detaille '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'rt=$request_time urt=$upstream_response_time';
server {
access_log /var/log/nginx/exemple.com.access.log detaille;
}

rt est la durée totale de la requête, urt celle de l’application derrière le proxy : repérer les requêtes lentes.

log_format json escape=json '{"time":"$time_iso8601","ip":"$remote_addr","methode":"$request_method",'
'"url":"$request_uri","statut":$status,"octets":$body_bytes_sent,'
'"duree":$request_time}';
access_log /var/log/nginx/access.json json;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

Ubuntu installe une configuration logrotate pour Nginx :

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

Elle fait tourner les journaux chaque semaine (14 archives) et demande à Nginx de rouvrir ses fichiers.

Fenêtre de terminal
# Codes de réponse les plus fréquents
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# Adresses IP les plus actives
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Pages les plus demandées
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Erreurs 5xx
awk '$9 ~ /^5/' /var/log/nginx/access.log | tail -20
# Requêtes lentes (avec le format « detaille » : champ rt=…)
grep -o 'rt=[0-9.]*' /var/log/nginx/exemple.com.access.log | sort -t= -k2 -rn | head

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

server {
listen 127.0.0.1:8080;
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
Fenêtre de terminal
curl http://127.0.0.1:8080/nginx_status

Résultat : connexions actives, requêtes traitées, connexions lisant, écrivant ou en attente.

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/
sudo apt install apache2-utils
ab -n 1000 -c 20 https://exemple.com/ # test de charge simple (à lancer sur son propre serveur)
Symptôme Piste
worker_connections are not enough Augmenter worker_connections et worker_rlimit_nofile
too many open files Limite de fichiers ouverts : worker_rlimit_nofile et LimitNOFILE du service
Disque plein à cause des journaux Vérifier logrotate, réduire access_log, du -sh /var/log/nginx
Page lente rt et urt dans les journaux : application lente (urt élevé) ou réseau
Les fichiers compressés ne le sont pas gzip_types incomplet, ou fichier sous gzip_min_length
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 »