Nginx · 2 min read · Jan 23, 2026

Rate Limiting 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 ngx_http_limit_req_module können Sie ein Ratenlimit definieren, und wenn ein Besucher dieses Limit überschreitet, erhält er einen 503-Fehler.

1 Verwendung des HttpLimitReqModule (ngx_http_limit_req_module)

Ö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 das Limit also auf eine halbe Anfrage pro Sekunde setzen möchten, würden Sie 30r/m (30 Anfragen pro Minute) verwenden.

Um dieses Limit in Kraft zu setzen, verwenden wir die limit_req-Direktive. 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 andernfalls, wenn Sie eine einzelne Seite mit vielen Bildern, CSS und JavaScript-Dateien laden, wahrscheinlich das gegebene Ratenlimit 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 dieses Ratenlimit zum vorher definierten Sitzungsbereich gehört (wegen zone=one), was bedeutet, dass das Ratenlimit 1r/s beträgt. Sie können sich die Bedeutung von burst wie eine Art Warteschlange vorstellen. Es bedeutet, dass, wenn Sie das Ratenlimit ü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:

Nginx-Ratenlimit angewendet.

).

Wenn Sie diese Warteschlange nicht verwenden möchten (d.h. sofort einen 503 ausliefern, wenn jemand das Ratenlimit ü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:

service nginx reload

2 Links

Über den Autor

Falko Timme ist der Eigentümer von Timme Hosting (ultra-schnelles nginx Webhosting). Er ist der Hauptbetreuer von HowtoForge (seit 2005) und einer der Hauptentwickler von ISPConfig (seit 2000). Er hat auch zum O’Reilly-Buch “Linux System Administration” beigetragen.

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.