レート制限時に429 httpコードを返すようにnginxを設定するにはどうすればよいですか?


11

スロットル/レート制限時にデフォルトの503(サービス利用不可)の代わりにhttpステータスコード429(Too Many Requests)を返すようにnginxを設定するにはどうすればよいですか?

参考までに、HttpLimitReqModuleでリバースプロキシとしてnginxを使用しています。429ステータスコードのドラフト仕様はRFC6585です。

stackexchanged に関するこの(閉じた)質問は、error_pageディレクティブを使用できることを示しています。ただし、実際にサーバーの問題があり(顧客が私たちに過度に当たらない)、サーバーが503 Service Unavailableを返す必要がある場合、429を返したくありません。

助言がありますか?


参考までに、すべての503を429にマッピングしないと不可能なため、この機能の拡張リクエストを作成しました。
アダムブロド

回答:


19

良いニュース、バージョン1.3.15 http://mailman.nginx.org/pipermail/nginx/2013-March/038306.html

「limit_req_status」および「limit_conn_status」ディレクティブがあります。Gentoo Linuxでそれらをテストしました(モジュールlimit_reqとlimit_conをコンパイルする必要があることに注意してください)。

これらの設定を使用すると、あなたが求めていたものを達成できると思います:

limit_req_status 429;
limit_conn_status 429;

私はこれを簡単に確認しました:

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

リクエストレートが高く、nginxに設定された制限があるため、ディレクティブをアクティブにした後、ほとんどのリクエストが失敗しました。

limit_req zone=api burst=15 nodelay;

1
..「ab2」とは何ですか?
XXL

abはからのツールですapache2-utils。UbuntuではabCentOsの下にありますがab2
ディーター

1

VBartの応答と他のコメントに基づいて、503エラーを429にマッピングするのが最良の選択肢であることは明らかです。

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

nginx(1.3.x)はlimit_reqおよびlimit_connに503ステータスコードのみを使用するため、これは素晴らしいアプローチです。


これは最良の選択肢ではありません。429は特定のユースケースであり、429を返すためにすべての潜在的な503(サービス利用不可)をマッピングすることは、ユーザーを誤解させ、無効にします。たとえば、クライアントは429を表示してバックオフ再試行ロジックを使用する場合がありますが、503がスロットリングに関係ない場合は役に立ちません。
エディ

0

Nginx自体は、limit_reqおよびlimit_conn以外の場合に503を決して返しません。


1
ああ、それは面白い。だから、error_pageを使用して503を429に置き換えた場合、あまりにも多くのリクエストを送信しているのでない限り、あまりにも多くのリクエストを顧客に伝えることはないでしょうか?
アダムブロッド

はい、本当ですが、1つだけ例外があり、(proxy/factcgi/scgi/uwsgi)_intercept_errors有効にしていません。nginx.org/r/proxy_intercept_errors
VBart

nginxが提供するアプリが503を返す可能性もあります。これにより、クライアントはnginxからの接続制限またはアプリからのサーバーエラーを確認しにくくなります。
bbaja42
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.