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.1 et un en-tête Connection vide.
  • proxy_next_upstream : ne rejouez pas les requêtes non idempotentes (POST) sans réflexion.
  • Timeouts alignés avec l'application : un proxy_read_timeout trop 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

Autres labs de cette technologie