Nginx における 2 つの現在の制限方法についての簡単な説明

Nginx における 2 つの現在の制限方法についての簡単な説明

負荷は通常、システム設計時に予測されます。システムがパブリック ネットワークに公開されている場合、悪意のある攻撃や通常のバースト トラフィックによってシステムが過負荷になる可能性があり、電流制限は保護対策の 1 つです。電流制限は流れを制御することです。この記事ではNginxの電流制限設定を2つ記録します。

人生における「現在の限界」とは?

電流制限は新しいものではなく、日常生活のいたるところで行われています。以下にいくつか例を挙げます。

博物館:文化遺産を保護するため、1日あたりの入場者数を制限

高速鉄道のセキュリティチェック:セキュリティチェックポイントは複数あります。乗客は順番に並び、セキュリティチェックのスピードに応じてスタッフが入場を許可するかどうかを決定します。休日には、セキュリティ チェックポイントを追加して処理能力を向上させ (水平方向の拡張)、待機領域の長さを増やす (保留中のタスクをキャッシュする) ことができます。

銀行業務を処理するには、まず全員が番号を取得し、各窓口でその番号を呼び出して処理します。各窓口の処理速度は顧客の具体的な業務によって異なり、誰もが列に並んで番号が呼ばれるのを待つだけです。仕事が終わる時間が近い場合は、顧客に明日また来るように伝えます(交通渋滞を拒否します)。

ダム放流:ダムはゲートを通じて放流量(処理速度)を制御できます。

上記の「電流制限」の例により、サービスプロバイダーは顧客に安定したサービスを提供できるようになります。

Nginx レート制限

Nginx は現在 2 つの制限方法を提供しています。1 つはレートを制御する方法、もう 1 つは同時接続数を制御する方法です。

制御率

通常の電流制限

ngx_http_limit_req_module モジュールは、リーキー バケット アルゴリズムを使用してリクエスト処理レートを制限する機能を提供します。次の例では、nginx の limit_req_zone および limit_req ディレクティブを使用して、単一の IP のリクエスト処理レートを制限します。

nginx.conf に現在の制限設定を追加します http:

フォーマット: limit_req_zone キー ゾーン レート

http {
 limit_req_zone $binary_remote_addr ゾーン=myRateLimit:10m レート=10r/s;
}

limit_req ディレクティブを使用して電流制限を適用するようにサーバーを構成します。

サーバー{
 位置 / {
 limit_req ゾーン = myRateLimit;
 proxy_pass http://my_upstream;
 }
}

key: 現在の制限オブジェクトを定義します。binary_remote_addr はキーであり、remote_addr (クライアント IP) に基づく現在の制限を意味します。binary_ の目的は、メモリ使用量を圧縮することです。

zone: アクセス情報を格納する共有メモリ ゾーンを定義します。myRateLimit:10m は、サイズが 10M で名前が myRateLimit のメモリ領域を示します。 1M では 16,000 個の IP アドレスのアクセス情報を保存でき、10M では 16W 個の IP アドレスのアクセス情報を保存できます。

rate は最大アクセス レートを設定するために使用されます。rate=10r/s は、1 秒あたり最大 10 件のリクエストが処理されることを意味します。 Nginx は実際にはリクエスト情報をミリ秒単位の精度で追跡するため、10r/s は実際の制限であり、100 ミリ秒ごとに 1 つのリクエストが処理されます。つまり、前のリクエストが処理されてから 100 ミリ秒以内に別のリクエストが到着した場合、そのリクエストは拒否されます。

トラフィックバーストの処理

上記の例では、レートを 10r/s に制限しています。通常のトラフィックが急増した場合、制限を超えるリクエストは拒否され、バーストトラフィックを処理できなくなります。この問題は、バーストパラメータを組み合わせることで解決できます。

サーバー{
 位置 / {
 limit_req ゾーン=myRateLimit バースト=20;
 proxy_pass http://my_upstream;
 }
}

バーストとは、設定された処理速度を超えた後に処理できる追加リクエストの数を意味します。 rate=10r/s の場合、1 秒が 10 に分割され、つまり 100 ミリ秒ごとに 1 つのリクエストを処理できます。

ここで、**burst=20** は、21 のリクエストが同時に到着した場合、Nginx は最初のリクエストを処理し、残りの 20 のリクエストをキューに入れ、その後 100 ミリ秒ごとに 1 つのリクエストがキューから取り出されて処理されます。リクエスト数が 21 を超える場合、サーバーは余分なリクエストの処理を拒否し、503 を返します。

ただし、バースト パラメータのみを使用することは現実的ではありません。バースト = 50 で、レートが依然として 10r/s であると仮定します。キュー内の 50 のリクエストは 100 ミリ秒ごとに 1 つずつ処理されますが、50 番目のリクエストは 50 * 100 ミリ秒、つまり 5 秒間待機する必要があります。このような長い処理時間は当然許容されません。

したがって、burst は nodelay と組み合わせて使用​​されることが多いです。

サーバー{
 位置 / {
 limit_req ゾーン=myRateLimit バースト=20 ノードレイ;
 proxy_pass http://my_upstream;
 }
}

nodelay は、burst パラメータ用です。burst=20 nodelay は、これらの 20 のリクエストが遅延なく即座に処理されることを意味し、これは特別な事項の特別な処理に相当します。ただし、これらの 20 件のバースト要求がすぐに処理されたとしても、後続の要求はすぐには処理されません。 burst=20 は、キャッシュ キューの 20 スロットを占有するのと同じです。リクエストが処理されたとしても、これらの 20 スロットは 100 ミリ秒ごとに 1 つずつしか解放できません。

これにより、安定したレートの効果が得られるだけでなく、突然のトラフィックフローにも正常に対処できるようになります。

接続数を制限する

ngx_http_limit_conn_module は、limit_conn_zone および limit_conn ディレクティブを使用して接続数を制限する機能を提供します。以下は Nginx の公式例です。

limit_conn_zone $binary_remote_addr ゾーン=perip:10m;
limit_conn_zone $server_name ゾーン=サーバーあたり:10m;

サーバー{
 ...
 limit_conn ペリフェラル 10;
 limit_conn パーサーバー 100;
}

limit_conn perip 10 はキー $binary_remote_addr を使用します。これは、1 つの IP が一度に保持できる接続が最大 10 個に制限されることを意味します。

limit_conn perserver 100 キーは $server_name で、仮想ホスト (サーバー) が同時に処理できる同時接続の合計数を示します。

接続は、リクエスト ヘッダーがバックエンド サーバーによって処理された後にのみカウントされることに注意してください。

ホワイトリストの設定

電流制限は主に外部アクセス用です。イントラネットアクセスは比較的安全で、電流制限は必要ありません。ホワイトリストを設定するだけで済みます。これは、2 つの Nginx ツール モジュール ngx_http_geo_module と ngx_http_map_module を使用して実行できます。

nginx.conf の http セクションでホワイトリストを設定します。

ジオ$制限{
 デフォルト 1;
 10.0.0.0/8 0;
 192.168.0.0/24 0;
 172.20.0.35 0;
}

マップ $limit $limit_key {
 0 "";
 1 $バイナリリモートアドレス;
}

limit_req_zone $limit_key ゾーン=myRateLimit:10m レート=10r/s;

geo は、ホワイトリストに登録された IP (サブネットまたは IP) の場合は 0 を返し、その他の IP の場合は 1 を返します。

map は limit を limit_key に変換します。$limit が 0 (ホワイトリスト) の場合は空の文字列を返します。1 の場合はクライアントの実際の IP アドレスを返します。

limit_req_zoneの電流制限キーは使用されなくなりました代わりに、**limit_key を使用して値を動的に取得します。ホワイトリストの場合、limit_req_zone 制限キーは空の文字列となり、制限はありません。ホワイトリストでない場合は、クライアントの実際の IP が制限されます。

さらに読む

現在の制限に加えて、ngx_http_core_module はデータ転送速度 (一般にダウンロード速度と呼ばれる) を制限する機能も提供します。

例えば:

場所 /flv/ {
 .flv;
 20分後に制限レートを設定します。
 制限レート 100k;
}

この制限はリクエストごとに適用されます。つまり、最初の 20 MB をダウンロードする際はクライアントの速度が制限されず、それ以降の制限は 100 kb/s になります。

Nginx の現在の 2 つの制限方法についての上記の簡単な説明は、編集者が皆さんと共有する内容のすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM をサポートしていただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx + consul + upsync を使用して動的負荷分散を実現する方法の詳細な説明
  • https暗号化アクセス用にnginxを設定するための詳細なチュートリアル
  • nginx 設定ファイルパスとリソースファイルパスを表示する方法
  • Windows 上で Nginx+Tomcat クラスタを実装するプロセスの分析
  • nginxとlvsのメリットとデメリット、そして適切な使用環境
  • nginxがドメイン名を設定した後のセカンダリディレクトリ内の異なるプロジェクトの設定操作

<<:  vue2 vue3 での Echarts の詳細な使用方法

>>:  MySQLデータベースパラダイムの詳細な説明

推薦する

MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論

目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...

UniappはBaidu Voiceを使用して録音をテキストに変換する機能を実現

3日間さまざまな困難に遭遇した後、ようやくこの機能を実現しました。正常に実装できる方法を見つける前に...

HTML+CSS+JavaScript でシンプルな三目並べゲームを作成する

目次HTMLの実装CSSを追加Javascript部分の実装デモアドレス HTMLの実装まず、hea...

CSS スタイルが機能しない (史上最も完全な解決策の概要)

ページを作成するときに、記述した CSS スタイルが有効にならないことがあります。この現象にはさまざ...

Linux システムで複数のバージョンの PHP を共存させるソリューション (超シンプル)

PHP7が出たので、最新バージョンのファンとしては、早速アップグレードして体験してみました。しかし...

Linux で pip 操作中にタイムアウトが発生する問題を解決する方法

Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...

Vue ミックスインの使い方の詳しい説明

目次Vue ミックスインの使用ミックスインでのデータアクセスミックスイン/index.jsホーム.v...

LinuxでPythonの組み込みバージョンを削除する手順の詳細な説明

大きな落とし穴、Linuxシステムに付属するPythonのバージョンを簡単に削除しないでください1....

MySQL デュアルマシン ホットスタンバイ実装ソリューション [テスト可能]

目次1. コンセプト2. 環境の説明3. マスタースレーブホットスタンバイ実装1. コンセプト1. ...

ウェブページ作成時のHTMLタグの使用に注意してください

この記事では、Web ページの作成を学習するときに注意すべき HTML タグに関するいくつかの問題を...

VMware 仮想マシンで HTTP サービスを確立して分析する手順

1. xshell を使用して仮想マシンに接続するか、仮想マシンに直接コマンドを入力します。以下はx...

js での Object.create インスタンスの使用法の詳細な説明

1. Object.create() メソッドを使用して新しいオブジェクトを作成し、既存のオブジェク...

MySQL構成SSL証明書ログインの実装

目次序文1. MySQLはSSL構成を有効にする1.1 SSLが有効になっているかどうかを確認する1...

最新の人気スクリプトAutojsソースコード共有

今日は、最新の人気スクリプト 50 個を含むソース コードを共有します。現在、Mine Guard ...

カルーセル効果を実現するためのネイティブJavaScript+CSS

この記事では、参考までに、カルーセル効果の具体的なコードをJavaScript+CSSを使用して実装...