ngx_http_limit_req_module モジュール
設定例 ディレクティブ limit_req limit_req_dry_run 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 |
共有メモリ領域とリクエストのバーストサイズの上限を設定します。リクエストレートが領域に設定されたレートを超えると、処理されるリクエストが定義されたレートになるようにそれらの処理が遅らされます。超過したリクエストはその数がバーストサイズの上限を超えるまで遅延され、超えた場合にはerrorで終了されます。デフォルトではバーストサイズの上限は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;
delay
パラメータ(1.15.7)は、過剰なリクエストが遅延する制限を指定します。デフォルト値は0です。つまり、全てのリクエストは遅延されます。
いくつかの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_dry_run |
---|---|
デフォルト: |
limit_req_dry_run off; |
コンテキスト: |
http , server , location |
このディレクティブはバージョン1.17.1で導入されました。
ドライランモードを有効にします。このモードでは、リクエストの処理速度は制限されませんが、共有メモリゾーンでは、通常通りに過剰なリクエストの数が考慮されます。
構文: |
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の状況を保持することができます。
領域のストレージが使い果たされると、最も長く使われていない状態が削除されます。新しい状態が作成できなかった後であったとしても、リクエストはerrorで終了します。
レートは秒間当たりのリクエストで指定されます(r/s)。もし秒間あたり1リクエスト未満のレートが望ましい場合は、分間あたりのリクエストで指定されます (r/m)。例えば、秒間当たり2分の1のリクエストは 30r/m です。
sync
パラメータ (1.15.3) は共有されたメモリ領域のsynchronization を有効にします。
このsync
パラメータは商用サブスクリプションの一部として利用可能です。
さらに、商用サブスクリプションの一部として、1.17.7からAPIを使ってそのような共有メモリゾーンの状態情報を取得または再設定することができます。
埋め込み変数
$limit_req_status
-
リクエスト処理率を制限した結果を保持します (1.17.6):
PASSED
、DELAYED
、REJECTED
、DELAYED_DRY_RUN
、REJECTED_DRY_RUN