スロットル/レート制限時にデフォルトの503(サービス利用不可)ではなくhttpステータスコード429(リクエストが多すぎる)を返すようにnginxを設定するにはどうすればよいですか?
参考までに、HttpLimitReqModuleでnginxをリバースプロキシとして使用しています。 429ステータスコードのドラフト仕様は RFC6585 です。
この(閉じた) question は、stackexchangedで error_page ディレクティブを使用できることを示しています。ただし、私はしないでくださいサーバーの問題が実際にあり(顧客があまりに多くの問題を抱えていない場合)、サーバーは429を返す必要があります503 Service Unavailableを返します。
助言がありますか?
バージョン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;
VBartの応答と他のコメントに基づいて、最良のオプションは503エラーを429にマップすることです。
error_page 503 = 429 /too-many-requests.html
Nginx(1.3.x)は、limit_reqおよびlimit_connに503ステータスコードのみを使用するため、これは適切なアプローチです。
Nginx自体は、limit_reqおよびlimit_conn以外の場合、503を返しません。