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

推薦する

スタイル属性 (element.style) で定義されたインライン スタイルを削除する方法

Magento を頻繁に変更する場合、element.style に遭遇することがあります。 これは...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

IDEA 2020.3.1 で Tomcat をデプロイし、最初の Web プロジェクトを作成するプロセスの詳細な説明

目次Tomcat の紹介Tomcat の展開Web プロジェクトの作成tomcatの設定プロジェクト...

WeChatミニプログラムでの仮想リストの実装例

目次序文分析する初期レンダリング方法初期最適化さらなる最適化方法2序文ほとんどのミニプログラムには、...

CSS リセットスタイルリセットの実装例

はじめに: すべてのブラウザには、「ユーザー エージェント スタイル シート」と呼ばれる、すべてのペ...

MySQL でテーブル メタデータ ロックを待機する理由と方法

MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...

Nodeはkoa2を使用してシンプルなJWT認証方式を実装します

JWT の紹介JWTとは正式名称はJSON Web Tokenで、現在最も人気のあるクロスドメイン認...

MySQL シャーディング入門ガイド

序文リレーショナル データベースは、システムのボトルネックになる可能性が高くなります。単一のマシンの...

MySQLデータベース移行におけるデータ文字化けの問題を解決する

リーダーの指示のもと、Java プロジェクトを引き継ぎ、リファクタリングを行う必要がありました。同時...

子コンポーネントを通じて親コンポーネントのプロパティを変更するための Vue のさまざまな実装方法

目次序文一般的な方法1. 親コンポーネントを介して子コンポーネントの発行イベントをリッスンしてpro...

大量のデータをMySQLにインポートする際に発生する問題と解決策の分析

プロジェクトでは、SQL を使用してデータ分析を実行するために、大量のデータをデータベースにインポー...

CentOS 7.5 に Python 3.6.6 を最初からインストールするための詳細なチュートリアル

ps: 環境はタイトル通りです依存関係をインストールする yum インストール openssl-de...

MySQL 5.7 解凍版のインストールとアンインストール、およびよくある問題の概要

1. インストール1. ダウンロードMySQLをダウンロードするには、MySQL公式サイトhttp:...

MySQL ソートの原則とケース分析

序文ソートはデータベースの基本的な機能であり、MySQL も例外ではありません。ユーザーは、Orde...

FileZilla を使用して FTP サーバーに接続するプロセスの図

最初にサーバー上に FTP サーバーをセットアップし始めたとき、接続できないことがわかったので、Fi...