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 を指定します。