NGINX - Drosseln Sie Anfragen, um Missbrauch zu verhindern

28

Der Grund, warum ich dies tun möchte, ist, dass Benutzer mit JavaScript gegen unsere API entwickeln und einige Entwickler es vermasseln und Besucher veranlassen, den Server mit AJAX-Anforderungen zu zuschlagen. Wenn dies passiert, möchte ich in der Lage sein, die API-Anforderungen auf vielleicht 50 Anforderungen pro Minute oder etwas in diesem Sinne zu drosseln .

Hinweis: (besonders DB-intensive Ressourcen, also möglicherweise eher auf Pfadebene als serverweit (z. B. "/ json_api /", aber nicht "/ static /").

orokusaki
quelle

Antworten:

36

Dies kann mit dem LimitReqModule mit Nginx erfolgen. Wenn dies jedoch für einen Reverse-Proxy gilt, sollten Sie die von HAProxy unterstützte neue Ratenbeschränkung ausprobieren .

Ich fand die Begrenzung der Nginx-Rate ein wenig verwirrend , um die genaue gewünschte Rate zu erhalten.

Aber Sie haben im Grunde etwas wie:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

im httpAbschnitt und dann so etwas wie das Folgende im locationAbschnitt innerhalb des serverAbschnitts:

limit_req zone=default burst=10 nodelay;

Um es für einen bestimmten Abschnitt wie /staticSie nicht zu haben, würden Sie das einfach zu einem separaten machen locationund es nicht mit der limit_reqDirektive (oder der Umkehrung) versehen.

Kyle Brandt
quelle
Vielen Dank. Können Sie erklären, was diese Dinge tun (Zone, Burst, Nodelay)? Und wollten Sie zone=limit_req_zonestattdessen setzen?
orokusaki
Ehrlich gesagt kann ich sie nicht so gut erklären, weshalb ich das Gefühl habe, dass es nur zu verwirrend ist. Michaels Erklärung in dem von mir angegebenen Link hört sich so an, als ob es machbar wäre. Ich glaube nicht, dass ich irgendwelche Tippfehler habe, was Ihre zweite Frage betrifft ... Die Moduldokumentation, mit der ich verlinkt habe, enthält ein Beispiel, das möglicherweise hilfreich ist.
Kyle Brandt
2
Zone, Burst und Nodelay sind auf der Nginx-Wiki-Seite über das Ratenbegrenzungsmodul dokumentiert , das bereits aus der obigen Antwort verlinkt ist.
Mark Stosberg
Kyle, weißt du, ob es eine Möglichkeit gibt, das Ratenlimit pro Standort mit einem anderen Auslöser zu kombinieren (z. B. Authorization-Header). In meinem Fall möchte ich möglicherweise die Rate eines bestimmten Benutzers drosseln.
Nils
1
@Nils AFAICS Sie können die $http_authorizationVariable verwenden, um eine neue Zone zu definieren, in der der Schlüssel ein solcher Header ist, und nicht die IP-Adresse. limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/sVerwenden Sie dann die per_userZone in den Abschnitten des Standorts, in denen Sie die Begrenzung der Benutzerrate vornehmen möchten . Ungetestet habe ich nur die Dokumentation und die Liste der Nginx-Variablen gelesen ... lass es mich wissen, wenn du das ausprobierst!
idrarig