モジュール 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アドレスからのリクエスト)ごとにリクエスト処理レートを制限するために使用されます。「リーキーバケット」方式を用いて制限を行います。

設定例

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

共有メモリゾーンとリクエストの最大バーストサイズを設定します。リクエストレートがゾーンに対して設定されたレートを超えると、リクエストは定義されたレートで処理されるように遅延されます。過剰なリクエストは、その数が最大バーストサイズを超えるまで遅延され、その場合はエラーでリクエストが終了します。デフォルトでは、最大バーストサイズはゼロです。例えば、以下のディレクティブは

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) は、過剰なリクエストが遅延し始める制限値を指定します。デフォルト値はゼロです。つまり、すべての過剰なリクエストが遅延されます。

複数のlimit_reqディレクティブを使用できます。例えば、次の設定では、単一の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で追加されました。

レート超過によりサーバーがリクエストの処理を拒否した場合、またはリクエスト処理を遅延させた場合のログレベルを設定します。遅延のログレベルは拒否よりも1レベル低くなります。例えば、「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には正確に1つの変数を含めることができました。

使用例

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

ここでは、状態は10メガバイトのゾーン「one」に保持され、このゾーンのリクエスト処理レートは平均して1秒間に1リクエストを超えることはできません。

クライアントのIPアドレスがキーとして機能します。$remote_addrの代わりに、ここでは$binary_remote_addr変数が使用されています。$binary_remote_addr変数のサイズは、IPv4アドレスの場合は常に4バイト、IPv6アドレスの場合は常に16バイトです。格納された状態は、32ビットプラットフォームでは常に64バイト、64ビットプラットフォームでは常に128バイトを占有します。1メガバイトのゾーンは約1万6千個の64バイトの状態、または約8千個の128バイトの状態を保持できます。

ゾーンストレージが枯渇した場合、最後に使用された状態が削除されます。それでも新しい状態を作成できない場合、リクエストはエラーで終了します。

レートは、1秒あたりのリクエスト数(r/s)で指定されます。1秒あたりのリクエスト数が1未満の場合は、1分あたりのリクエスト数(r/m)で指定されます。例えば、1秒間に0.5リクエストは30r/mです。

syncパラメータ (1.15.3) は、共有メモリゾーンの同期を有効にします。

syncパラメータは、当社の商用サブスクリプションの一部として提供されています。

さらに、当社の商用サブスクリプションの一部として、そのような共有メモリゾーンごとにステータス情報を1.17.7以降、取得またはリセットできます。APIを使用します。

埋め込み変数

$limit_req_status
リクエスト処理レートの制限の結果(1.17.6)を保持します:PASSEDDELAYEDREJECTEDDELAYED_DRY_RUN、またはREJECTED_DRY_RUN