はじめに
Nginxの流量制限の適切な設定値についてのメモです。
流量制限値が不適切だとどうなるか
値が厳しすぎると正常なリクエストが流量制限にひっかかります。CSSやスクリプト等のコンテンツが応答されなくなり、ブラウザの挙動がおかしくなります。リロードすると直ったりするので「キャッシュの問題かも」などと原因を見失って時間を浪費します。
私の場合は、タイミングによって画像が表示されなかったり、スクリプトが動作しなかったりしました。
設定値について
設定値を決める前提条件
1秒あたりのページリクエスト数と1ページあたりのリクエスト数を元に値を決めます。今回は以下のように見積もりました。
- ページリクエストは最大で1秒に2回
- 1ページあたりのリクエスト数はCSS、画像、JavaScript等含めると最大で50
設定例
私の環境では送信元のIPアドレス単位で制限したいので、以下のような設定にしています。
/etc/nginx/nginx.confの抜粋
limit_req_zone $binary_remote_addr zone=myzone:1m rate=100r/s;
server {
location /myapp {
limit_req zone=myzone burst=50 nodelay;
}
}
ポイントは3つのパラメータです。
共有メモリサイズ
zone=myapp:1mで指定します。
キー情報を格納するメモリです。1MBで8000保持できます。この8000は同時接続クライアント数になります。
レート
rate=100r/sで指定します。
1秒あたりのリクエスト数です。今回はページリクエストが2回/秒、1ページのリクエストが50なので、100リクエスト/秒となります。
バースト
burst=50で指定します。
レート制限超過を救済するバッファ数です。レート制限で指定した「100リクエスト/秒」は実際には「1リクエスト/10ミリ秒」という制限になります。10ミリ秒以内に複数リクエストが到着すると503エラーが返ります。10ミリ秒以内に1ページの全リクエストが到着しても良いように50にします。
例えば、1ページ分の50個のリクエストが同時に来たとすると、1個が処理されて49個がバースト領域に保持されます。この49個は10ミリ秒毎に1個ずつ処理されていき、500ミリ秒で50個のリクエスト処理が完了します。
参考:ログについて
特に設定しない限り流量制限による503エラーはNginxのログに出力されません。503エラーが発生したのにログに出力されていない場合は、流量制限を疑いましょう。