Mit dem nginx HttpLimitReq- Modul können Anforderungen durch IP begrenzt werden. Ich verstehe jedoch nicht, was die Option "Nodelay" bewirkt.
Wenn die überschüssigen Anforderungen innerhalb der Limit-Burst-Verzögerung nicht erforderlich sind, sollten Sie das Nodelay verwenden
limit_req zone=one burst=5 nodelay;
quelle
TL; DR: Die Nodelay-Option ist nützlich, wenn Sie ein Ratenlimit festlegen möchten, ohne den zulässigen Abstand zwischen Anforderungen einzuschränken.
Es fiel mir schwer, die anderen Antworten zu verdauen, und dann entdeckte ich eine neue Dokumentation von Nginx mit Beispielen, die dies beantworten: https://www.nginx.com/blog/rate-limiting-nginx/
Hier ist der relevante Teil. Gegeben:
Wenn Sie nodelay hinzufügen:
quelle
Ich sehe es so:
Anfragen werden so schnell wie möglich bearbeitet, bis die Zonenrate überschritten wird. Die Zonenrate ist "im Durchschnitt". Wenn Ihre Rate also "
1r/s
Burst" ist10
, können Sie 10 Anfragen in einem 10-Sekunden-Fenster haben.Nachdem die Zonenrate überschritten wurde:
ein. Ohne
nodelay
werden weitere Anfragen bisburst
verzögert.b. Mit
nodelay
werden weitere Anfragen bis zuburst
so schnell wie möglich bearbeitet.Nachdem der
burst
Wert überschritten wurde, gibt der Server eine Fehlerantwort zurück, bis das Burst-Fenster abläuft. Beispielsweise muss der Client für Rate1r/s
und Burst10
bis zu 10 Sekunden auf die nächste akzeptierte Anfrage warten.quelle
Die Einstellung definiert, ob Anforderungen verzögert werden, damit sie der gewünschten Rate entsprechen, oder ob sie einfach abgelehnt werden ... etwas, ob die Ratenbegrenzung vom Server verwaltet wird oder die Verantwortung an den Client übergeben wird.
nodelay
GeschenkAnfragen werden so schnell wie möglich bearbeitet. Anfragen, die über das angegebene Limit gesendet werden, werden mit dem Code as abgelehnt
limit_req_status
nodelay
abwesend (auch bekannt als verzögert)Anfragen werden mit einer Rate bearbeitet, die dem angegebenen Limit entspricht. Wenn beispielsweise eine Rate von 10 Req / s festgelegt ist, wird jede Anforderung in> = 0,1 (1 / Rate) Sekunden verarbeitet, wodurch nicht zugelassen wird, dass die Rate überschritten wird, sondern dass die Anforderungen gesichert werden. Wenn genügend Anforderungen gesichert werden, um den Bucket zu überlaufen (was auch durch ein gleichzeitiges Verbindungslimit verhindert würde), werden sie mit dem Code as abgelehnt
limit_req_status
.Die wichtigsten Details finden Sie hier: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263, wo diese Logik einsetzt, wenn das Limit noch nicht überschritten wurde, und jetzt die Verzögerung wird optional auf die Anfrage angewendet. Die Anwendung
nodelay
insbesondere der Richtlinie kommt hier ins Spiel: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495, wodurch der Wert vondelay
oben 0 ausgelöst wird Der Handler muss sofort zurückkehren,NGX_DECLINED
wodurch die Anforderung an den nächsten Handler weitergeleitet wird (und nichtNGX_AGAIN
, dass sie erneut verarbeitet werden muss).quelle
Das habe ich beim ersten Lesen der Einführung von https://www.nginx.com/blog/rate-limiting-nginx/ nicht verstanden .
Jetzt bin ich sicher, dass ich es verstehe und meine Antwort ist bisher die beste. :) :)
Nehmen wir an :
10r/s
gesetzt, die maximale Leistungsfähigkeit des Servers ist zB10000r/s
das ist ,10r/ms
und es gibt nur 1 Client im Moment.Hier ist der Hauptunterschied zwischen
10r/s per IP burst=40 nodelay
und10r/s per IP burst=40
.Wie unter https://www.nginx.com/blog/rate-limiting-nginx/ dokumentiert ( ich empfehle dringend, zuerst den Artikel zu lesen (mit Ausnahme des Abschnitts zur zweistufigen Ratenbegrenzung )), behebt dieses Verhalten ein Problem. Welcher?:
Überprüfen Sie den Entwurf, den ich gemacht habe. Die
40th
Anfrage erhält eine Antwort um,1s
während die andere um40th
eine Antwort erhält4s
.Dies kann die Serverfunktionen optimal nutzen: Antworten werden so schnell wie möglich zurückgesendet, wobei die
x r/s
Beschränkung auf einen bestimmten Client / eine bestimmte IP beibehalten wird.Aber hier gibt es auch Kosten. Die Kosten betragen:
Wenn Sie viele Clients auf dem Server sagen wir mal Client Warteschlangen
A
,B
undC
.Ohne
nodelay
werden die Anfragen in einer ähnlichen Reihenfolge wie zugestelltABCABCABC
.Mit
nodelay
ist die Reihenfolge eherAAABBBCCC
.Ich möchte den Artikel https://www.nginx.com/blog/rate-limiting-nginx/ hier zusammenfassen.
Die wichtigste Konfiguration ist vor allem
x r/s
.x r/s
Nur überschüssige Anfragen werden sofort abgelehnt.x r/s
+burst
, überschüssige Anfragen werden in die Warteschlange gestellt.1.
vs2.
, die Kosten sind, dass auf der Client-Seite die in der Warteschlange befindlichen Anfragen die Chancen späterer Anfragen in Anspruch nehmen, die die Chance hatten, bedient zu werden.Zum Beispiel
10r/s burst=20
gegen10r/s
das11th
wird Antrag soll unmittelbar nach der letztgenannten Bedingung abgelehnt werden, aber jetzt ist es eine Warteschlange gestellt und serviert. Die11th
Anfrage nimmt die21th
Chance der Anfrage ein.x r/s
+burst
+nodelay
, Bereits erklärt.PS Der Abschnitt zur zweistufigen Ratenbegrenzung des Artikels ist sehr verwirrend. Ich verstehe nicht, aber das scheint keine Rolle zu spielen.
Beispielsweise:
8 U / s? Ernsthaft? Es werden 17 Anfragen innerhalb von 3 Sekunden im Bild angezeigt, 17/3 = 8?
quelle