前提条件: 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 ゾーン=addr:10m; 2. 制限を適用するには、location {}、server {}、または http {} コンテキストで limit_conn ディレクティブを使用します。最初の引数は上記で設定した共有メモリ ゾーン名で、2 番目の引数は各キーに許可される接続数です。 場所 /download/ { limit_conn アドレス 1; } $binary_remote_addr 変数をパラメータとして使用する場合、制限は IP アドレスに基づいて行われます。また、$server_name 変数を使用して、特定のサーバーへの接続数を制限することもできます。 http { limit_conn_zone $server_name ゾーン=servers:10m; サーバー{ limit_conn サーバー 1000; } } リクエストレートの制限 レート制限は、DDoS 攻撃や CC 攻撃を防いだり、同時に多数のリクエストによってアップストリーム サーバーが過負荷になるのを防ぐために使用できます。この方法は、リーキー バケット アルゴリズムに基づいており、リクエストはさまざまなレートでバケットに到着し、固定レートでバケットから出ていきます。レート制限を使用する前に、「リーキー バケット」のグローバル パラメータを設定する必要があります。
これらのパラメータは、limit_req_zone ディレクティブを使用して設定されます。このディレクティブは http{} レベルで定義されます。このアプローチにより、異なるゾーンとリクエスト オーバーフロー パラメータを異なるコンテキストに適用できます。 http { #... limit_req_zone $binary_remote_addr ゾーン=one:10m レート=1r/s; } この構成では、サイズが 10m バイトの one という名前の共有メモリ ゾーンが作成されます。この領域には、$binary_remote_addr 変数を使用して設定されたクライアント IP アドレスの状態が保持されます。 $remote_addr にはクライアントの IP アドレスも含まれており、$binary_remote_addr には IP アドレスの短いバイナリ表現が保持されることに注意してください。 共有メモリ領域の最適なサイズは、次のデータを使用して計算できます: $binary_remote_addr IPv4 アドレスの値のサイズは 4 バイトで、64 ビット プラットフォーム上のストレージ状態は 128 バイトを占有します。したがって、約 16,000 個の IP アドレスの状態情報がこの領域の 1 MB を占めます。 NGINX が新しいエントリを追加する必要があるときにストレージ スペースが不足すると、最も古いエントリが削除されます。解放されたスペースがまだ新しいレコードを収容するのに不十分な場合、NGINX は 503 Service Unavailable ステータス コードを返します。これは、limit_req_status ディレクティブを使用して再定義できます。 このゾーンが設定されると、NGINX 構成の任意の場所、特に server {} 、 location {} 、および http {} コンテキストで limit_req ディレクティブを使用してリクエスト レートを制限できます。 http { #... limit_req_zone $binary_remote_addr ゾーン=one:10m レート=1r/s; サーバー{ #... 場所 /検索/ { limit_req ゾーン = 1; } } } 上記の設定を使用すると、nginx は /search/ ルートで 1 秒あたり 1 件以下のリクエストを処理し、合計レートが設定されたレートを超えないようにこれらのリクエストを遅延させます。 NGINX は、「バケット」(共有バケット 1)がいっぱいになるまで、このようなリクエストの処理を遅延します。バケット全体に到達するリクエストの場合、NGINX は 503 Service Unavailable エラーで応答します (limit_req_status がカスタム ステータス コードを設定していない場合)。 帯域幅を制限する 接続ごとの帯域幅を制限するには、limit_rate ディレクティブを使用します。 場所 /download/ { 制限レート 50k; } この設定により、クライアントは単一の接続で最大 50k/秒の速度でコンテンツをダウンロードできるようになります。ただし、クライアントは複数の接続を開いてこの制限を回避することができます。したがって、ダウンロード速度が指定された値を超えないようにすることが目的の場合は、接続数も制限する必要があります。たとえば、IP アドレスごとに 1 つの接続 (上記で指定した共有メモリ ゾーンを使用している場合) は次のようになります。 場所 /download/ { limit_conn アドレス 1; 制限レート 50k; } クライアントが一定量のデータをダウンロードした後にのみ制限を課すには、limit_rate_after ディレクティブを使用します。クライアントが一定量のデータ (ファイル ヘッダー、映画のインデックスなど) をすばやくダウンロードできるようにし、残りのデータのダウンロード速度を制限する (ユーザーが映画をダウンロードするのではなく視聴できるようにする) のが合理的である可能性があります。 制限レート500k以降; 制限レート 20k; 次の例は、接続数と帯域幅を制限するための組み合わせ構成を示しています。許可される最大接続数は、クライアント アドレスごとに 5 接続に設定されています。これは、最近のブラウザーでは通常、一度に最大 3 つの接続が開かれるため、最も一般的なケースに適しています。また、ダウンロードが提供される場所への接続は 1 つだけ許可されます。 http { limit_conn_zone $binary_remote_address ゾーン=addr:10m サーバー{ ルート /www/data; limit_conn アドレス 5; 位置 / { } 場所 /download/ { limit_conn アドレス 1; 1分後の制限レート; 制限レート 50k; } } } 内容は、ドキュメントの nginx リクエスト制限部分から翻訳されたもので、意味が若干調整されています。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: node.jsミドルウェアの種類についての簡単な説明
>>: MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル (win10)
この記事では、5つ星の評価を獲得するためのJSの具体的なコードを参考までに共有します。具体的な内容は...
目次序文1. トリガーの概要2. トリガーの作成2.1 トリガー構文の作成2.2 コード例3. トリ...
MySQL データベースでは、テーブルが互いに関連付けられた後は、それらを任意に削除することはできま...
よくある質問から議論を始めましょう。CSS を使用して要素の高さを [ブラウザ コンテンツ ウィンド...
Tomcat は、Java Community Process を通じて Sun が開発した、広く使...
ストアドプロシージャとコーディングMySQL ストアド プロシージャでは、テーブルとデータのエンコー...
目次概要0. JavaScriptとWeb開発の基礎1. Vueの基本概念Vue コア機能コンポーネ...
「どうしたの?」特定の種類のダイアログ ボックスに慣れていない限り、ダイアログ ボックスが表示された...
アプリケーションをコンテナ化した後、Docker コンテナを起動すると、デフォルトで root ユー...
Alibaba Cloud yum コマンドでのデフォルトの MySQL バージョンは 5.17**...
1. テキストの書式設定: この例では、HTML ファイル内のテキストを書式設定する方法を示します...
目次序文実装のアイデア効果:使用:メインソースコード:序文多くのケースを見た結果、単純な観点からは、...
目次1. リクエストを取得する: 2. 投稿リクエスト: 3. 拡張と補足Vue スキャフォールディ...
一般的に言えば、より完全な結果を得るためには、2 つ以上のテーブルから結果を取得する必要があります。...
導入Binlog ログ、つまりバイナリ ログ ファイルは、データベースに対するユーザー操作の SQL...