Configuration de la répartition de charge avec Nginx

Principe de la répartition de charge

Initialement, un seul serveur suffisait pour les applications web. Avec la croissance du trafic et la complexité des services, le besoin de scalabilité horizontale et de haute disponibilité a rendu nécessaire la distribution des requêtes sur plusieurs serveurs.

Mécanismes de répartition

Deux approches existent :

  • Scalabilité verticale : Amélioration des capacités matérielles d'un serveur
  • Scalabilité horizontale : Ajout de machines supplémentaires

Composants clés

  • Cluster applicatif : Groupe de serveurs hébergeant la même application
  • Répartiteur de charge : Dispositif distribuant les requêtes selon un algorithme défini

Avantages principaux

  • Gestion de la haute charge
  • Continuité de service (failover)
  • Extensibilité élastique
  • Renforcement de la sécurité

Méthodes courantes

Choix manuel

Interface proposant différents serveurs, laissant à l'utilisateur le choix de la connexion.

Rotation DNS

Répartition basique via enregistrements DNS multiples. Limités par :

  • Fiabilité réduite (délais de propagation)
  • Distribution inégale (cache local, absence de pondération)

Répartition couche 4/7

Couche 4 (Transport) : Basée sur IP/Port
Couche 7 (Application) : Basée sur contenu (URL, en-têtes)
Différences clés :

  • Performance supérieure en couche 4
  • Décision plus fine en couche 7
<!-- Exemple d'architecture courante -->
LVS (Couche 4) + Nginx (Couche 7)

Répartition couche 7 avec Nginx

Utilise le module proxy_pass pour rediriger vers un groupe de serveurs upstream.

Configuration de base

upstream app_servers {
  server 10.0.1.10:8080;
  server 10.0.1.11:8080;
}

server {
  listen 80;
  location / {
    proxy_pass http://app_servers;
  }
}

États des serveurs

État Description
down Serveur exclu temporairement
backup Serveur de secours
max_conns Connexions simultanées maximales
max_fails Échecs consécutifs avant désactivation

Stratégies de répartition

Stratégie Commande Cas d'usage
Rotation (par défaut) Serveurs homogènes
Pondérée weight Serveurs hétérogènes
Persistence IP ip_hash Sessions utilisateur
Connexions min least_conn Requêtes longues
Hachage URL hash $uri Optimisation cache

Exemples pratiques

Répartition par ressource

upstream video_servers {
  server 10.0.2.10:9000;
}

upstream file_servers {
  server 10.0.2.20:9000;
}

location /videos/ {
  proxy_pass http://video_servers;
}

location /documents/ {
  proxy_pass http://file_servers;
}

Réécriture d'URL

location /static/ {
  rewrite ^(/static/.*) /resources/$1 last;
}

location / {
  proxy_pass http://app_servers;
}

Répartition couche 4 avec Nginx

Nécessite le module stream (compilation avec --with-stream).

Exemple pour services TCP

stream {
  upstream db_cluster {
    server db1.example.com:3306;
    server db2.example.com:3306;
  }
  
  server {
    listen 3306;
    proxy_pass db_cluster;
  }
}

Procédure d'activation

  1. Sauvegarder le binaire Nginx existant
  2. Recompiler avec ./configure --with-stream
  3. Remplacer le binaire et redémarrer

Étiquettes: nginx repartition-charge reverse-proxy haute-disponibilité optimisation-performance

Publié le 15 juillet à 09h46