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
sudoou 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) ouwrk.
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
realippour extraire l’IP réelle du client. - Adresses IPv6 :
$binary_remote_addrfait 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_statuset alertez sur les taux élevés de 429.
Résumé
- La limitation de débit Nginx utilise
limit_req_zone/limit_reqpour les taux de requêtes etlimit_conn_zone/limit_connpour 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
burstetnodelaypour les charges de production. - Utilisez
limit_req_status 429pour retourner le code HTTP 429 standard.