前提条件: nginx には ngx_http_limit_conn_module モジュールと ngx_http_limit_req_module モジュールが必要です。コマンド 2>&1 nginx -v | tr ' ' '\n'|grep limit を使用して、対応するモジュールがあるかどうかを確認できます。ない場合は、再コンパイルしてください。これら 2 つのモジュールをインストールします。
テスト バージョンは次のとおりです: nginx バージョンは 1.15
リンクの数を制限します
1.limit_conn_zone ディレクティブを使用してキーを定義し、共有メモリ ゾーンのパラメーターを設定します (ワーカー プロセスはこのゾーンを使用してキー値のカウンターを共有します)。最初のパラメータは、キーとして評価される式を指定します。 2 番目のパラメーターzone は、ゾーンの名前とサイズを指定します:
limit_conn_zone $binary_remote_addr zone=addr:10m;
2。制限を適用するには、location {}、server {}、または http {} のコンテキストで limit_conn ディレクティブを使用します。最初のパラメーターは次のとおりです。上記で設定した値 指定された共有メモリ領域名 2 番目のパラメータは、各キーに許可されるリンクの数です:
location /download/ { limit_conn addr 1; }
$binary_remote_addr 変数をパラメータとして使用する場合、それは、 IP アドレス。$server_name 変数を使用することもできます。特定のサーバーへの接続数を制限します:
http { limit_conn_zone $server_name zone=servers:10m; server { limit_conn servers 1000; } }
Limit request rate
レート制限は、 DDO、CC 攻撃を防ぐため、または上流サーバーが同時に攻撃されるのを防ぐために使用されます。 リクエストが多すぎるためフラッディングされます。この方法は、リクエストがさまざまなレートでバケットに到着し、固定レートでバケットから出ていくリーキー バケット アルゴリズムに基づいています。レート制限を使用する前に、「リーキー バケット」のグローバル パラメータを設定する必要があります。
key - クライアントを別のクライアントから区別するために使用されるパラメータ。通常は変数
共有メモリ ゾーン - これらのキーの状態を保持するゾーン (つまり、「リーキー バケット」) の名前とサイズ
rate - キーの数1 秒あたりのリクエスト (r/s で指定されたリクエスト レート制限) または 1 分あたりのリクエスト (r/m) (「リーキー バケット ドレイン」)。 1 分あたりのリクエスト数は、1 秒あたり 1 リクエスト未満のレートを指定します。
これらのパラメータは、limit_req_zone ディレクティブを使用して設定されます。このディレクティブは http {} レベルで定義されます。このアプローチにより、異なるゾーンを適用し、異なるコンテキストにオーバーフロー パラメーターを要求することができます。
http { #... limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; }
この構成では、1 という名前の 10m バイト サイズが作成されます。共有メモリ領域。この領域には、$binary_remote_addr 変数を使用して設定されたクライアント IP アドレスの状態が保持されます。 $remote_addr にはクライアントの IP アドレスも含まれますが、$binary_remote_addr には IP アドレスの短いバイナリ表現が含まれることに注意してください。
共有メモリ領域の最適なサイズは、次のデータを使用して計算できます。 $binary_remote_addr ipv4 アドレスの値のサイズは 4 バイトで、64 ビット プラットフォームのストレージ状態は 128 バイトを占めます。したがって、約 16000 個の IP アドレスの状態情報がこの領域の 1m バイトを占めます。
nginx が新しいエントリを追加する必要があるときにストレージ容量がなくなると、最も古いエントリが削除されます。解放されたスペースがまだ新しいレコードを収容するのに十分でない場合、nginx は 503 サービス利用不可ステータス コードを返します。これは、limit_req_status ディレクティブを使用して再定義できます。
このゾーンを設定すると、nginx 構成内の任意の場所、特にサーバー {}、場所 {}、http {} で、limit_req ディレクティブを使用してリクエスト レートを制限できます。コンテキスト:
http { #... limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { #... location /search/ { limit_req zone=one; } } }
の使用上記の設定では、nginx は /search/ ルートで 1 秒あたり 1 リクエストを処理しません。これらのリクエストの処理を遅らせる方法は、合計レートが設定レートを超えないようにすることです。 nginx は、「バケット」 (共有バケット 1) がいっぱいになるまで、そのようなリクエストの処理を遅らせます。バケット全体に対するリクエストの場合、nginx は 503 サービス利用不可エラーで応答します (limit_req_status にカスタム セットのステータス コードがない場合)。
帯域幅の制限
接続ごとの帯域幅を制限するには、次の limit_rate ディレクティブを使用します。
location /download/ { limit_rate 50k; }
この設定では、クライアントは1 つの接続で最大 50k/秒の速度でコンテンツをダウンロードできます。ただし、クライアントは複数の接続を開いてこの制限を回避できます。したがって、ダウンロード速度が指定値を超えないようにすることが目的の場合は、接続数も制限する必要があります。たとえば、IP アドレスごとに 1 つの接続 (上で指定した共有メモリ領域を使用する場合):
location /download/ { limit_conn addr 1; limit_rate 50k; }
クライアントが一定量のデータをダウンロードした後にのみ制限を課すには、limit_rate_after ディレクティブを使用します。クライアントが一定量のデータ (ファイル ヘッダー、ムービー インデックスなど) を迅速にダウンロードできるようにし、残りのデータのダウンロード速度を制限する (ユーザーにダウンロードの代わりにムービーを視聴させる) ことが合理的かもしれません。
limit_rate_after 500k; limit_rate 20k;
次の例は、接続数と帯域幅を制限するための組み合わせ構成を示しています。許可される接続の最大数は、クライアント アドレスごとに 5 接続に設定されています。最新のブラウザでは通常、一度に最大 3 つの接続が開かれるため、ほとんどの一般的なケースで機能します。同時に、ダウンロード用に指定された場所では 1 つの接続のみが許可されます:
http { limit_conn_zone $binary_remote_address zone=addr:10m server { root /www/data; limit_conn addr 5; location / { } location /download/ { limit_conn addr 1; limit_rate_after 1m; limit_rate 50k; } } }
以上がNginx が http リソースリクエストを制限する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。