NGINXのlimit_req_zone
ディレクティブにおけるzone
の値は、リクエストレート制限のための共有メモリゾーンを定義する部分です。このゾーンは、制限を適用するデータを保持するために使われます。
zone
の構成
zone
の値は以下の形式で指定します:
zone=<name>:<size>;
-
<name>
: ゾーンの名前。識別用の任意の名前を指定します。 -
<size>
: ゾーンのサイズ(メモリの容量)。共有メモリに割り当てる容量を指定します。
各パラメータの詳細
1. <name>
: ゾーン名
- 複数の制限ルールを管理する場合に、それぞれ異なるゾーン名を付けて識別します。
- ゾーン名はユニークである必要があります。
- 例:
limit_req_zone $binary_remote_addr zone=my_zone:10m rate=1r/s;
2. <size>
: ゾーンサイズ
- ゾーンに割り当てる共有メモリの容量をバイト単位(k, m, gの接尾辞で指定可能)で定義します。
- 必要なサイズは、制限するキーの種類と数に応じて変わります。
- 1つのキー(たとえばIPアドレス)には約64バイトが必要。
- したがって、10MBのゾーンは約160,000のキーを保持できます。
使用可能な変数
zone
に設定されるデータは、リクエストキー(制限の基準)に基づきます。このキーとして使用できるNGINX変数の例:
-
$binary_remote_addr
:- クライアントのIPアドレス(効率化のためバイナリ形式で保存)。
- 主にIPごとのリクエスト制限に使用。
- 例:
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=1r/s;
-
$remote_addr
:- クライアントのIPアドレス(テキスト形式)。
- バイナリ形式に比べて効率が劣るため、通常は
$binary_remote_addr
を使用するのが推奨されます。
-
$server_name
:- サーバー名ごとにリクエスト制限を適用。
- 例:
limit_req_zone $server_name zone=server_limit:10m rate=10r/s;
-
カスタムキー(複合キー):
- 変数を組み合わせてカスタムキーを作成可能。
- 例: IPアドレスとURIを組み合わせた制限。
limit_req_zone $binary_remote_addr$request_uri zone=custom_limit:20m rate=5r/s;
メモリサイズの設定例
-
小規模サイト:
limit_req_zone $binary_remote_addr zone=small_site:1m rate=10r/s;
- 1MBのメモリで約16,000キーを保持可能。
-
大規模サイト:
limit_req_zone $binary_remote_addr zone=large_site:100m rate=100r/s;
- 100MBのメモリで約1,600,000キーを保持可能。
注意点
- メモリサイズが不足すると、新しいエントリが追加できず、既存のエントリが上書きされる可能性があります。
- 過剰に大きなメモリサイズを指定すると、無駄なリソース消費につながるため、トラフィック量に応じた適切なサイズを設定してください。
limit_req_zone
のゾーン設定は、トラフィック制御の基盤となるため、環境や要件に合わせた計画的な構成が重要です。