Wie konfiguriere ich nginx so, dass bei Ratenbegrenzung 429 http-Code zurückgegeben wird?


11

Wie konfiguriere ich nginx so, dass beim Drosseln / Ratenbegrenzung der http-Statuscode 429 (Zu viele Anforderungen) anstelle des Standardcodes 503 (Dienst nicht verfügbar) zurückgegeben wird?

Zu Ihrer Information, ich verwende nginx als Reverse-Proxy mit dem HttpLimitReqModule. Der Entwurf der Spezifikation für den Statuscode 429 lautet RFC6585 .

Diese (geschlossene) Frage zu stackexchanged zeigt, dass die Direktive error_page verwendet werden kann . Ich möchte jedoch keine 429 zurückgeben, wenn tatsächlich ein Serverproblem vorliegt (nicht der Kunde schlägt uns zu sehr) und der Server 503 Service nicht verfügbar zurückgeben sollte.

Irgendwelche Vorschläge?


Zu Ihrer Information, ich habe eine Erweiterungsanforderung für diese Funktion erstellt, da dies nicht möglich ist, ohne alle 503s auf 429s abzubilden.
Adambrod

Antworten:


19

Gute Nachrichten mit Version 1.3.15 http://mailman.nginx.org/pipermail/nginx/2013-March/038306.html

Wir haben die Anweisungen "limit_req_status" und "limit_conn_status". Ich habe sie gerade unter Gentoo Linux getestet (beachten Sie, dass Sie die Module limit_req und limit_con kompilieren müssen).

Mit diesen Einstellungen können Sie meiner Meinung nach das erreichen, wonach Sie gefragt haben:

limit_req_status 429;
limit_conn_status 429;

Ich habe dies mit einem kurzen überprüft:

ab2 -n 100000 -c 55 "http://127.0.0.1/api/v1

Bei dem die meisten Anforderungen nach dem Aktivieren der Direktive aufgrund der hohen Anforderungsrate und des konfigurierten Limits in nginx fehlgeschlagen sind:

limit_req zone=api burst=15 nodelay;

1
..was ist "ab2"?
XXL

abist ein Werkzeug von apache2-utils. auf Ubuntu ist es ababer unter CentOs ist es ab2.
Dieter

1

Basierend auf der Antwort von VBart und anderen Kommentaren ist klar, dass die beste Option darin besteht, 503 Fehler 429s zuzuordnen.

error_page 503 = 429 /too-many-requests.html

Da nginx (1.3.x) nur 503 Statuscodes für limit_req und limit_conn verwendet, sollte dies ein guter Ansatz sein.


Dies ist nicht die beste Option. 429 ist ein spezifischer Anwendungsfall. Die Zuordnung aller potenziellen 503s (Dienst nicht verfügbar) zur Rückgabe eines 429 ist irreführend und für Benutzer ungültig. Zum Beispiel könnte ein Client einen 429 sehen und eine Back-Off-Wiederholungslogik verwenden, aber wenn der 503 nicht mit der Drosselung zusammenhängt, hilft dies nicht.
Eddie

0

Nginx selbst gibt in anderen Fällen als limit_req und limit_conn niemals 503 zurück.


1
Ah, das ist interessant. Sie sagen also, wenn ich 503 durch 429 mithilfe von error_page ersetze, werde ich Kunden niemals zu viele Anfragen mitteilen, es sei denn, sie senden wirklich zu viele Anfragen?
Adambrod

Ja, stimmt, aber mit nur einer Ausnahme, die Sie nicht (proxy/factcgi/scgi/uwsgi)_intercept_errorsaktiviert haben. nginx.org/r/proxy_intercept_errors
VBart

Es ist auch möglich, dass die von nginx bereitgestellte App 503 zurückgibt, was es für den Client schwierig macht, das Verbindungslimit von nginx oder den Serverfehler von der App zu erkennen.
bbaja42
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.