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データベースパラダイムの詳細な説明

推薦する

Ubuntu 18.04 に MySQL をインストールする (グラフィカル チュートリアル)

ヒント: 以下の操作はすべて root 権限で実行されます。 # MySQL がインストールされてい...

MySQL データベースの詳細な説明 - 複数テーブル クエリ - 内部結合、外部結合、サブクエリ、相関サブクエリ

複数テーブルクエリ複数のテーブルから関連するクエリ結果を取得するには、単一の SELECT ステート...

Vueプロジェクトでよく使われる実践的なスキルのまとめ

目次序文1. マルチレベルのデータとイベントの配信には$attrsと$listenersを使用する2...

星のフラッシュ効果を実現するjs

この記事の例では、スターフラッシュ効果を実現するためのjsの具体的なコードを参考までに共有しています...

MySQLはSQL文を使用してテーブル名を変更します

MySQL では、SQL ステートメント rename table を使用してテーブル名を変更できま...

Vue-cli を使用して Vue プロジェクトを構築する手順の詳細な説明

まず、Vue-cli をインストールする必要があります。 npm インストール -g vue-cli...

shtmlとhtmlの違い

Shtml と asp は似ています。shtml という名前のファイルでは、asp の命令と同様に、...

Docker イメージに基づいて Go プロジェクトをデプロイする方法と手順

知識への依存Go クロスコンパイルの基礎Dockerの基礎Dockerfileカスタムイメージの基本...

Linux システムでデプロイメント プロジェクトを設定する方法

1. ファイアウォールの設定を変更し、対応するポートを開きますLinux システムのファイアウォール...

Linux で at および cron スケジュールタスクをカスタマイズする方法

Linux システムには 2 種類のスケジュールされたタスクがあります。1 つは 1 回だけ実行され...

Reactでパスワード強度検出器を実装する方法

目次序文使用コンポーネントの記述データ構造分析プロセス分析基礎コードの分析他の要約する序文パスワード...

JSはプログレスバーのスムーズバージョンの詳細な計画を実装します

進捗バーがスムーズではないフロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤ...

MySQL で左結合を使用して where 条件を追加する問題の詳細な分析

現在の需要:グループとファクターの 2 つのテーブルがあります。1 つのグループは複数のファクターに...

vue 動的コンポーネント

目次1. コンポーネント2. キープアライブ2.1 問題点2.2 キープアライブを使って解決する2....

Linux 継続的インテグレーションで Maven を自動的にインストールする方法

Mavenパッケージを解凍する tar xf apache-maven-3.5.4-bin.tar....