Architecture de répartition de charge avec Nginx

Dans les architectures web modernes, la répartition de charge constitue un pilier fondamental pour garantir la scalabilité et la résilience des services. Lorsqu'un flux de requêtes dépasse les capacités d'un nœud unique, il devient indispensable de distribuer le trafic sur plusieurs instances. Nginx, grâce à son architecture événementielle non bloquante et sa faible empreinte mémoire, s'impose comme une solution logicielle de choix pour orchestrer cette distribution.

Prérequis et déploiement

Avant de configurer le frontal, il est nécessaire de disposer d'au moins trois machines sous Linux connectées sur le même réseau local. Sur la machine faisant office de proxy inverse, procédez à l'installation du service via le gestionnaire de paquets :

sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

Configuration du bloc upstream

Le cœur du mécanisme repose sur la directive upstream, qui définit le groupe de serveurs applicatifs. Modifiez le fichier /etc/nginx/nginx.conf ou créez une configuration dédiée :

http {
    upstream pool_applicatif {
        server 10.0.2.10;
        server 10.0.2.11;
        server 10.0.2.12;
    }

    server {
        listen 80;
        server_name mon-application.fr;

        location / {
            proxy_pass http://pool_applicatif;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Appliquez les modifications sans interrompre le service actif :

sudo nginx -s reload

Pour valider le routage, exécutez une requête répétée :

for i in {1..5}; do curl -s -o /dev/null -w "%{http_code}\n" http://mon-application.fr; done

Stratégies de distribution du trafic

Le comportement par défaut utilise un ordre cyclique, mais le moteur permet d'ajuster la logique selon la nature des charges de travail.

Répartition pondérée

Attribuez des coefficients pour diriger plus de requêtes vers des machines disposant de ressources supérieures :

upstream pool_applicatif {
    server 10.0.2.10 weight=4;
    server 10.0.2.11 weight=2;
    server 10.0.2.12 weight=1 down;
}

Connexions minimales

Idéal pour les traitements asynchrones ou longs, cet algorithme cible systématiquement le nœud ayant le moins de sessions ouvertes :

upstream pool_applicatif {
    least_conn;
    server 10.0.2.10;
    server 10.0.2.11;
    server 10.0.2.12;
}

Consistance par adresse IP

La directive ip_hash garantit qu'un client spécifique atteint toujours le même backend, ce qui s'avère utile pour maintenir l'état de session sans recourir à une base de données externe :

upstream pool_applicatif {
    ip_hash;
    server 10.0.2.10;
    server 10.0.2.11;
    server 10.0.2.12;
}

Gestion de la résilience et optimisation

Pour éviter que des requêtes ne soient routées vers des nœuds dégradés, combinez les paramètres de tolérance et les politiques de basculement :

upstream pool_applicatif {
    server 10.0.2.10 max_fails=3 fail_timeout=30s;
    server 10.0.2.11 max_fails=3 fail_timeout=30s;
}

location / {
    proxy_pass http://pool_applicatif;
    proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}

Journalisation et compression

Activez les traces pour auditer le trafic et réduisez la consommation de bande passante via la compression Gzip :

http {
    access_log /var/log/nginx/lb_access.log;
    error_log  /var/log/nginx/lb_error.log warn;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_types application/json text/css application/javascript image/svg+xml;
}

Diagnostic et maintenance opérationnelle

En cas de dysfonctionnement, la première étape consiste à inspecter les journaux d'erreurs en temps réel :

tail -f /var/log/nginx/lb_error.log

Vérifiez la connectivité réseau vers les cibles et validez la syntaxe avant chaque rechargement :

nginx -t
ping -c 4 10.0.2.10

Si le service refuse de démarrer, l'outil systemctl status nginx fournira le contexte précis de l'échec, permettant de corriger rapidement les directives invalides ou les conflits de ports.

Étiquettes: nginx load-balancing upstream-module reverse-proxy proxy-pass

Publié le 20 août à 13h50