Tutoriel3 min de lecture · Mis à jour le 29 sept. 2026
NGINX reverse proxy et répartition de charge — guide
Configurer NGINX en reverse proxy devant plusieurs backends, avec health checks passifs, en-têtes corrects, timeouts et journalisation.
- #load-balancing
- #http
- #high-availability
Configuration de base
upstream app_backend {
zone app_backend 64k; # partage l'état entre workers
least_conn; # ou round-robin par défaut, ip_hash…
server 10.0.1.11:8080 max_fails=3 fail_timeout=15s;
server 10.0.1.12:8080 max_fails=3 fail_timeout=15s;
server 10.0.1.13:8080 backup;
keepalive 32;
}
server {
listen 443 ssl;
server_name app.exemple.fr;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 3s;
proxy_read_timeout 30s;
proxy_next_upstream error timeout http_502 http_503;
}
}
Points d'attention
zone: sans zone partagée, chaque worker compte ses propres échecs et la répartition paraît incohérente.- Keepalive upstream : nécessite
proxy_http_version 1.1et un en-têteConnectionvide. proxy_next_upstream: ne rejouez pas les requêtes non idempotentes (POST) sans réflexion.- Timeouts alignés avec l'application : un
proxy_read_timeouttrop court produit des 504.
WebSocket
location /ws/ {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 1h;
}
Journalisation utile
log_format upstream '$remote_addr "$request" $status rt=$request_time '
'uct=$upstream_connect_time urt=$upstream_response_time ua=$upstream_addr';
access_log /var/log/nginx/app.log upstream;
upstream_addr révèle quel backend a répondu — indispensable pour diagnostiquer un nœud défaillant.
Tester et recharger
nginx -t && systemctl reload nginx
for i in $(seq 1 6); do curl -s https://app.exemple.fr/whoami; done