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.
Compression gzip
Section intitulée « Compression gzip »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 onest déjà actif dans lenginx.confd’Ubuntu, mais seulement pourtext/html:gzip_typesajoute 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.
Cache navigateur
Section intitulée « Cache navigateur »# Fichiers dont le nom change à chaque version (empreinte) : un anlocation ~* \.(?: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 revaliderlocation ~* \.html$ { add_header Cache-Control "no-cache";}Processus et connexions
Section intitulée « Processus et connexions »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 |
Cache des descripteurs de fichiers
Section intitulée « Cache des descripteurs de fichiers »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 et HTTP/3
Section intitulée « HTTP/2 et HTTP/3 »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.
Journaux
Section intitulée « Journaux »sudo tail -f /var/log/nginx/access.logsudo tail -f /var/log/nginx/error.logsudo journalctl -u nginx -n 50Format 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 …"Un journal par site
Section intitulée « Un journal par site »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) |
Format enrichi, avec durée
Section intitulée « Format enrichi, avec durée »# Contexte httplog_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.
Format JSON
Section intitulée « Format JSON »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;Réduire le bruit
Section intitulée « Réduire le bruit »location = /favicon.ico { access_log off; log_not_found off; }location = /robots.txt { access_log off; log_not_found off; }Rotation des journaux
Section intitulée « Rotation des journaux »Ubuntu installe une configuration logrotate pour Nginx :
cat /etc/logrotate.d/nginxsudo logrotate -d /etc/logrotate.d/nginx # simulationsudo logrotate -f /etc/logrotate.d/nginx # rotation immédiateElle fait tourner les journaux chaque semaine (14 archives) et demande à Nginx de rouvrir ses fichiers.
Analyser les journaux
Section intitulée « Analyser les journaux »# Codes de réponse les plus fréquentsawk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# Adresses IP les plus activesawk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Pages les plus demandéesawk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Erreurs 5xxawk '$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 | headPour une analyse interactive : sudo apt install goaccess puis sudo goaccess /var/log/nginx/access.log --log-format=COMBINED.
Surveiller : stub_status
Section intitulée « Surveiller : stub_status »server { listen 127.0.0.1:8080; location /nginx_status { stub_status; allow 127.0.0.1; deny all; }}curl http://127.0.0.1:8080/nginx_statusRésultat : connexions actives, requêtes traitées, connexions lisant, écrivant ou en attente.
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-utilsab -n 1000 -c 20 https://exemple.com/ # test de charge simple (à lancer sur son propre serveur)Dépannage
Section intitulée « Dépannage »| 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 »Pour aller plus loin
Section intitulée « Pour aller plus loin »- Documentation : Module
ngx_http_gzip_moduleet Performance tuning - Retour : Installation