Nginx · 2 min read · Oct 11, 2025
Ratenbegrenzung mit Nginx

Dieser Artikel erklärt, wie man das nginx HttpLimitReqModule verwendet, um die Anzahl der Anfragen für eine gegebene Sitzung zu begrenzen. Dies ist nützlich, wenn Ihre Seite beispielsweise von einem Bot überflutet wird, der mehrere Anfragen pro Sekunde sendet und somit die Serverlast erhöht. Mit dem HttpLimitReqModule können Sie eine Ratenbegrenzung definieren, und wenn ein Besucher diese Rate überschreitet, erhält er einen 503-Fehler.
1 Verwendung des HttpLimitReqModule
Öffnen Sie Ihre nginx.conf…
nano /etc/nginx/nginx.conf… und definieren Sie einen Bereich, in dem die Sitzungszustände gespeichert werden - dies muss innerhalb des http {} Containers erfolgen:
http {
[...]
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
[...]
}Dieser Bereich wird als one bezeichnet und hat 10 MB Speicherplatz. Anstelle der Variablen $remote_addr verwenden wir die Variable $binary_remote_addr, die die Größe des Zustands auf 64 Bytes reduziert. In einem 1MB-Bereich können etwa 16.000 Zustände gespeichert werden, sodass 10MB Platz für etwa 160.000 Zustände bieten, was für Ihre Besucher ausreichend sein sollte. Die Rate ist auf eine Anfrage pro Sekunde begrenzt. Bitte beachten Sie, dass Sie hier ganzzahlige Werte verwenden müssen. Wenn Sie die Begrenzung auf eine halbe Anfrage pro Sekunde festlegen möchten, würden Sie 30r/m (30 Anfragen pro Minute) verwenden.
Um diese Begrenzung in Kraft zu setzen, verwenden wir die Direktive limit_req. Sie können diese Direktive in http {}, server {} und location {} Containern verwenden, aber meiner Meinung nach ist sie am nützlichsten in location {} Containern, die Anfragen an Ihre Anwendungsserver (PHP-FPM, mongrel usw.) weiterleiten, da Sie ansonsten, wenn Sie eine einzelne Seite mit vielen Bildern, CSS- und JavaScript-Dateien laden, wahrscheinlich die gegebene Ratenbegrenzung mit einer einzigen Seitenanfrage überschreiten würden.
Lassen Sie uns dies also in einem location ~ .php$ {} Container umsetzen:
[...]
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
limit_req zone=one burst=5;
}
[...]limit_req zone=one burst=5; gibt an, dass diese Ratenbegrenzung zum zuvor definierten Sitzungsbereich gehört (wegen zone=one), was bedeutet, dass die Ratenbegrenzung 1r/s beträgt. Sie können sich die Bedeutung der burst-Option als eine Art Warteschlange vorstellen. Das bedeutet, dass, wenn Sie die Ratenbegrenzung überschreiten, die folgenden Anfragen verzögert werden, und nur wenn Sie mehr Anfragen in der Warteschlange haben, als im burst-Parameter angegeben, erhalten Sie einen 503-Fehler (z.B. so:

).
Wenn Sie diese Warteschlange nicht verwenden möchten (d.h. sofort einen 503 ausliefern, wenn jemand die Ratenbegrenzung überschreitet), müssen Sie die nodelay-Option verwenden:
[...]
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
limit_req zone=one burst=5 nodelay;
}
[...]Vergessen Sie nicht, nginx neu zu laden, um Ihre Änderungen wirksam zu machen:
systemctl nginx reload2 Links
- nginx: https://nginx.org/
- HttpLimitReqModule: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.