Nginx では ngx_http_limit_req_module
を使ってサーバが処理するリクエストの数を制限できます。例えば、同じ $request_filename
へのリクエストを1秒に1回に制限する場合は次のようになります。
http { limit_req_zone $request_filename zone=foo:10m rate=1r/s; # (省略) server { # (省略) location / { # limit_req_zone で設定した上限 (1r/s) を超えたリクエストには503が返される limit_req zone=foo; } } }
この設定では、1秒以内に2回以上のリクエストがあるとサーバは即座に503を返します。
しかし現実的には、一時的なリクエストの増加は許容したいことがあります。
そのためには burst
と nodelay
を使います。
limit_req zone=foo burst=10 nodelay;
burst
を指定すると、上限を超えたリクエストは burst
に指定した数だけキューイングされ、リクエスト数が burst
を超えたときだけ503が返されるようになります。
nodelay
は処理を遅延させないためのオプションです。burst
だけが指定された場合、キューイングされたリクエストの処理は rate
の上限を超えないように遅延されます。一時的なリクエストの増加を許容したいときにこの遅延は不要ですので nodelay
を指定します。