Pourquoi la Limitation de Débit est Importante

Tout serveur web public est soumis aux pics de trafic, aux scrapers automatisés, aux tentatives de force brute et aux attaques par déni de service distribué (DDoS). Sans limitation de débit, un seul client abusif peut épuiser le CPU, la mémoire et les descripteurs de fichiers de votre serveur.

La limitation de débit intégrée de Nginx fournit une couche de défense légère et performante qui opère au niveau du proxy inverse, avant que les requêtes n’atteignent votre application.

Prérequis

  • Nginx 1.18+ installé (les deux modules sont compilés par défaut).
  • Accès sudo ou root pour éditer les fichiers de configuration Nginx.
  • Familiarité de base avec la syntaxe de configuration Nginx.
  • Un outil de test comme curl, Apache Bench (ab) ou wrk.

Solution Étape par Étape

1. Définir une Zone de Limitation

http {
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
    limit_req_zone $binary_remote_addr zone=general:10m rate=30r/s;
}

2. Appliquer les Limites aux Emplacements

server {
    listen 80;
    server_name exemple.com;

    limit_req zone=general burst=50 nodelay;
    limit_req_status 429;

    location /api/auth/login {
        limit_req zone=login burst=3 nodelay;
        proxy_pass http://backend;
    }

    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://backend;
    }

    location /static/ {
        limit_req off;
        alias /var/www/static/;
    }
}

Comprendre burst et nodelay :

  • burst=N : Permet jusqu’à N requêtes supplémentaires au-dessus de la limite d’être mises en file d’attente.
  • nodelay : Traite les requêtes en rafale immédiatement sans délai.
  • delay=N : (Nginx 1.15.7+) Hybride : les N premières requêtes en rafale sont traitées immédiatement, le reste est retardé.

3. Configurer la Limitation de Connexions

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        limit_conn addr 10;
        limit_conn_status 429;

        location /telechargements/ {
            limit_conn addr 2;
            limit_rate 500k;
        }
    }
}

4. Exclure les IPs de Confiance

http {
    geo $limit_key {
        default         $binary_remote_addr;
        10.0.0.0/8      "";
        192.168.1.0/24  "";
        203.0.113.50    "";
    }

    limit_req_zone $limit_key zone=api:10m rate=10r/s;
}

5. Réponses d’Erreur Personnalisées

error_page 429 = @rate_limited;

location @rate_limited {
    default_type application/json;
    return 429 '{"error": "rate_limit_exceeded", "message": "Trop de requêtes. Veuillez réessayer dans quelques secondes.", "retry_after": 1}';
}

6. Tester la Configuration

sudo nginx -t
sudo systemctl reload nginx
ab -n 100 -c 10 http://exemple.com/api/data

Pièges et Cas Particuliers

  • Chaînes de proxy inverse : Si Nginx est derrière un équilibreur de charge, utilisez le module realip pour extraire l’IP réelle du client.
  • Adresses IPv6 : $binary_remote_addr fait 16 octets pour IPv6 (vs 4 pour IPv4). Dimensionnez les zones en conséquence.

Prévention

  • Combinez avec un WAF : Utilisez ModSecurity, Cloudflare ou AWS WAF pour une défense en profondeur.
  • Utilisez fail2ban : Bloquez automatiquement les IPs qui dépassent les limites de manière persistante.
  • Surveillez avec des métriques : Exportez les métriques avec le module stub_status et alertez sur les taux élevés de 429.

Résumé

  • La limitation de débit Nginx utilise limit_req_zone/limit_req pour les taux de requêtes et limit_conn_zone/limit_conn pour les limites de connexion.
  • L’algorithme du seau percé lisse les pics de trafic au lieu d’imposer des comptages rigides par seconde.
  • Configurez toujours burst et nodelay pour les charges de production.
  • Utilisez limit_req_status 429 pour retourner le code HTTP 429 standard.

Articles Connexes