33
この設定例では、limitbyaddrという名前の共有メモリーゾーンを作成します。使用さ
れる事前定義されたキーは、バイナリ形式のクライアントのIPア ド レ ス で す 。共 有 メ モ
リーゾーン の サイズ は 10MBに設定されています。ゾーンは、キーワード引数を使用して
レートを設 定します。limit_reqはディレクティブは必須のキーワード引数を取ります:
zone。zoneは使用する共有メモリ要求制限ゾーンにディレクティブを指示します。レート
を超える要求は、limit_req_status ディレクティブで定義されているように429HTTP
コ ー ド が 返 さ れ ま す 。デ フ ォ ル ト は 503であるため、ステータスを400レベルの範囲に設
定することをお勧めします。これは、問題が実際にはクライアントにある場合に、サー
バーに問題があるように示唆します。
limit_reqディレクティブにオプションのキーワード引数を使用して、2段 階のレート制
限を有 効にします。
server {
location / {
limit_req zone=limitbyaddr burst=12 delay=9;
}
}
場合によっては、クライアントは一度に多くの要求を行う必要があり、その後、さらに
要求を行う前に一定期間レートを下げます。キーワード引数burstを 使 用 し て 、ク ラ イ
アントに要求を却下せずに、レート制限を超 過することを許可することができます。レ
ートを超 過した要求は 、設 定された値までレート制 限に一 致するように処 理 が 遅 延さ
れます。以下のキーワード引数のセットはこの振る舞いを変更します:delayとnodelay
です。nodelayは引数は値を取りません。クライアントがバースト可能な値を一度に消
費できるようにしますが、レート制限を満たすだけの時間が経過するまで、すべての要
求 は 拒 否 さ れ ま す 。こ の 例 で 、nodelayを使用した場合には、クライアントは最初の1秒
間に12の要求を消費できますが、別の要求を行うには、初めの要求から4秒待つ必要が
あります。delayキーワード引数はスロットルなしで事前に作成できる要求の数を定義し
ま す 。こ の ケ ー ス で は 、ク ラ イ ア ン ト は 遅 延 な し で 9つの要求を前もって行うことができ、
次の3つは抑制され、4秒以 内に発 生した 追 加の 要 求は拒 否されます。
解説
レート制限モジュールは、すべての人に質の高いサービスを提供しながら、不正で急速
な要求から保護するために非常に強力です。要求のレートを制限する理由はたくさんあ
り ま す が 、そ の 1つがセキュリティです。ログインページに非常に厳しい制限を設けるこ
とで、ブルートフォース攻撃を拒否できます。すべての要求に適切な制限を設定して、ア
プリケーションでサービス拒否を発生させたり、リソースを浪費したりしようとする悪意
のあるユーザーの計画を無効にすることができます。レート制限モジュールの構成は、
レシピ 3.5で説明した接続制限モジュールとよく似ており、その懸念事項の多くがここで
も当てはまります。1秒あたりの要求数または1分あたりの要求 数で 制限するレートを指
定できます。レート制 限に 達したら、イン シ デントがログされます。この 例では使 用され
ていないディレクティブもあります。limit_req_log_levelはデフォルトでerrorになりま
3.6 レート制限 |