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 zone=name [burst=number] [nodelay | delay=number];
デフォルト: -
コンテキスト: 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 on | off;
デフォルト:
limit_req_dry_run off;
コンテキスト: http, server, location

このディレクティブはバージョン1.17.1で導入されました。

ドライランモードを有効にします。このモードでは、リクエストの処理速度は制限されませんが、共有メモリゾーンでは、通常通りに過剰なリクエストの数が考慮されます。

構文: limit_req_log_level info | notice | warn | error;
デフォルト:
limit_req_log_level error;
コンテキスト: http, server, location

このディレクティブはバージョン0.8.18から導入されました。

サーバがレートの超過によりリクエストの処理を拒否する場合、またはリクエストの処理を遅延する場合の、望ましい記録レベルを設定します。遅延の記録レベルは拒否の記録レベルより一段低いです; 例えば、もし"limit_req_log_level notice"が指定されたなら、遅延はinfo レベルで記録されます。

構文: limit_req_status code;
デフォルト:
limit_req_status 503;
コンテキスト: http, server, location

このディレクティブはバージョン1.3.15から導入されました。

拒否されたリクエストへの応答へ返すステータスコードを設定します。

構文: limit_req_zone key zone=name:size rate=rate [sync];
デフォルト: -
コンテキスト: 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): PASSEDDELAYEDREJECTEDDELAYED_DRY_RUNREJECTED_DRY_RUN

TOP
inserted by FC2 system