Warum Ratenbegrenzung Wichtig ist
Jeder öffentlich zugängliche Webserver ist Traffic-Spitzen, automatisierten Scrapern, Brute-Force-Anmeldeversuchen und verteilten Denial-of-Service-Angriffen (DDoS) ausgesetzt. Ohne Ratenbegrenzung kann ein einzelner missbräuchlicher Client die CPU, den Speicher und die Dateideskriptoren Ihres Servers erschöpfen und den Dienst für legitime Benutzer unverfügbar machen.
Die integrierte Ratenbegrenzung von Nginx bietet eine leichtgewichtige, leistungsstarke Verteidigungsschicht, die auf der Reverse-Proxy-Ebene arbeitet — bevor Anfragen jemals Ihre Anwendung erreichen.
Voraussetzungen
- Nginx 1.18+ installiert (beide Module sind standardmäßig kompiliert).
sudo- oder Root-Zugang zur Bearbeitung der Nginx-Konfigurationsdateien.- Grundlegende Vertrautheit mit der Nginx-Konfigurationssyntax.
- Ein Testwerkzeug wie
curl, Apache Bench (ab) oderwrk.
Schritt-für-Schritt-Lösung
1. Eine Ratenbegrenzungszone Definieren
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. Ratenbegrenzung auf Standorte Anwenden
server {
listen 80;
server_name beispiel.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/;
}
}
burst und nodelay verstehen:
burst=N: Erlaubt bis zu N zusätzliche Anfragen über dem Limit, die in eine Warteschlange gestellt werden.nodelay: Verarbeitet Burst-Anfragen sofort ohne Verzögerung.delay=N: (Nginx 1.15.7+) Hybrid: Die ersten N Burst-Anfragen werden sofort verarbeitet, der Rest wird verzögert.
3. Verbindungsbegrenzung Konfigurieren
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
limit_conn addr 10;
limit_conn_status 429;
location /downloads/ {
limit_conn addr 2;
limit_rate 500k;
}
}
}
4. Vertrauenswürdige IPs Ausschließen
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. Benutzerdefinierte Fehlerantworten
error_page 429 = @rate_limited;
location @rate_limited {
default_type application/json;
return 429 '{"error": "rate_limit_exceeded", "message": "Zu viele Anfragen. Bitte versuchen Sie es in einigen Sekunden erneut.", "retry_after": 1}';
}
6. Konfiguration Testen
sudo nginx -t
sudo systemctl reload nginx
ab -n 100 -c 10 http://beispiel.com/api/data
Stolperfallen und Sonderfälle
- Reverse-Proxy-Ketten: Wenn Nginx hinter einem Load Balancer steht, verwenden Sie das
realip-Modul, um die echte Client-IP zu extrahieren. - IPv6-Adressen:
$binary_remote_addrist 16 Bytes für IPv6 (vs. 4 für IPv4). Dimensionieren Sie die Zonen entsprechend.
Prävention
- Kombinieren Sie mit einer WAF: Verwenden Sie ModSecurity, Cloudflare oder AWS WAF für Verteidigung in der Tiefe.
- Verwenden Sie fail2ban: Sperren Sie automatisch IPs, die dauerhaft Ratenbegrenzungen überschreiten.
- Überwachen Sie mit Metriken: Exportieren Sie Metriken mit dem
stub_status-Modul und alarmieren Sie bei erhöhten 429-Raten.
Zusammenfassung
- Nginx Ratenbegrenzung verwendet
limit_req_zone/limit_reqfür Anfrage-Raten undlimit_conn_zone/limit_connfür Verbindungslimits. - Der Leaky-Bucket-Algorithmus glättet Traffic-Spitzen anstatt starre Zählungen pro Sekunde zu erzwingen.
- Konfigurieren Sie immer
burstundnodelayfür Produktionslasten. - Verwenden Sie
limit_req_status 429, um den Standard-HTTP-429-Statuscode zurückzugeben.