web-dev-qa-db-ja.com

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

スロットル/レート制限時にデフォルトの503(サービス利用不可)ではなくhttpステータスコード429(リクエストが多すぎる)を返すようにnginxを設定するにはどうすればよいですか?

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

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

助言がありますか?

11
adambrod

バージョン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;
19
vanthome

VBartの応答と他のコメントに基づいて、最良のオプションは503エラーを429にマップすることです。

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

Nginx(1.3.x)は、limit_reqおよびlimit_connに503ステータスコードのみを使用するため、これは適切なアプローチです。

1
adambrod

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

0
VBart