ngx_http_limit_req_module モジュール
設定例 ディレクティブ limit_req limit_req_log_level limit_req_status limit_req_zone |
ngx_http_limit_req_module
モジュール (0.7.21) は、定義されたキーごとのリクエストの処理レート、特に一つのIPアドレスから来るリクエストの処理レートを制限します。制限は"leaky bucket"メソッドを使って行われます。
設定例
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5; }
ディレクティブ
構文: |
limit_req
|
---|---|
デフォルト: | - |
コンテキスト: |
http , server , location |
共有メモリ領域とリクエストのバーストサイズの上限を設定します。リクエストレートが領域に設定されたレートを超えると、処理されるリクエストが定義されたレートになるようにそれらの処理が遅らされます。超過したリクエストはその数がバーストサイズの上限を超えるまで遅延され、超えた場合にはエラー503 (Service Temporarily Unavailable)で終了されます。デフォルトではバーストサイズの上限は0です。例えば、次のディレクティブは、
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /search/ { limit_req zone=one burst=5; }
は、1秒あたりのリクエストが平均で1未満で、バーストが5リクエストを超えないものを許可します。
リクエストが制限されている間の超過したリクエストの遅延が望ましくない場合は、パラメータnodelay
が使われるべきです:
limit_req zone=one burst=5 nodelay;
いくつかのlimit_req
ディレクティブが有り得ます。例えば、次の設定は1つのIPアドレスから来るリクエストと、同時にバーチャルサーバによって処理されるリクエストの処理レートを制限するでしょう。
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; server { ... limit_req zone=perip burst=5 nodelay; limit_req zone=perserver burst=10; }
現在のレベルにlimit_req
ディレクティブが無い場合に限り、これらのディレクティブは上のレベルから引き継がれます。
構文: |
limit_req_log_level
|
---|---|
デフォルト: |
limit_req_log_level error; |
コンテキスト: |
http , server , location |
このディレクティブはバージョン0.8.18から導入されました。
サーバがレートの超過によりリクエストの処理を拒否する場合、またはリクエストの処理を遅延する場合の、望ましい記録レベルを設定します。遅延の記録レベルは拒否の記録レベルより一段低いです; 例えば、もし"limit_req_log_level notice
"が指定されたなら、遅延はinfo
レベルで記録されます。
構文: |
limit_req_status |
---|---|
デフォルト: |
limit_req_status 503; |
コンテキスト: |
http , server , location |
このディレクティブはバージョン1.3.15から導入されました。
拒否されたリクエストへの応答へ返すステータスコードを設定します。
構文: |
limit_req_zone
|
---|---|
デフォルト: | - |
コンテキスト: |
http |
様々なキーに対してステータスを保持する共有メモリ領域のパラメータを設定します。特に、状況は超過リクエストの現在の数を保持します。key
には、文字列、変数、およびそれらの組み合わせを含めることができます。空のキーの値のリクエストは考慮されません。
バージョン1.7.6以前は、key
は一つの変数しか含むことができませんでした。
利用例:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
ここで、状況は10メガバイトの領域 "one" に保持され、この領域の平均処理レートは秒間当たり1リクエストを超えることはできません。
クライアントのIPアドレスがキーとして役立ちます。$remote_addr
の代わりに$binary_remote_addr
変数がここでは使われていることに注意してください。$binary_remote_addr
変数のサイズは、IPv4アドレスの場合は4バイトで、IPv6アドレスの場合は常に6です。保持された状況は32-bitプラットフォーム上では常に32バイトを占有し、64-bitプラットフォーム上では常に64バイトを占有します。一メガバイトの領域は約16,000個の64-byteの状況、あるいは約8,000個の128-byteの状況を保持することができます。領域の保管場所が使い尽くされると、サーバはそれ以上のリクエストに対して503 (Service Temporarily Unavailable) エラーを返すでしょう。
レートは秒間当たりのリクエストで指定されます(r/s)。もし秒間あたり1リクエスト未満のレートが望ましい場合は、分間あたりのリクエストで指定されます (r/m)。例えば、秒間当たり2分の1のリクエストは 30r/m です。