Nginxのアクセスボリューム制御の詳細な説明

Nginxのアクセスボリューム制御の詳細な説明

目的

リクエスト アクセス ボリュームを制御するための Nginx ngx_http_limit_conn_module および ngx_http_limit_req_module モジュールを理解します。

Nginx のモジュール性

nginx の内部構造は、コア モジュールと一連の機能モジュールで構成されています。モジュール型アーキテクチャにより、各モジュールの機能が比較的シンプルになり、高い凝集性が実現され、Nginx の機能拡張も容易になります。

Web リクエストの場合、Nginx の有効なすべてのモジュールが、ゲームのレベルと同様にチェーンを形成します。各モジュールは、圧縮用の ngx_http_gzip_module モジュール、認証用の ngx_http_auth_basic_module モジュール、プロキシ用の ngx_http_proxy_module モジュールなど、特定の機能を担当します。サーバーへの接続要求は、各 Nginx モジュールによって順番に処理されます。これらのモジュールによって処理された後にのみ、要求は実際にバックグラウンド プログラム コードに渡され、処理されます。

Nginx 同時アクセス制御

Web サーバーの場合、Web クローラーや悪意のある大容量トラフィック攻撃に遭遇すると、サーバーのメモリと CPU がいっぱいになり、帯域幅もいっぱいになります。そのため、成熟したサーバー プロキシ ソフトウェアとしては、これらの状況を制御できることが必要です。

Nginx で同時実行を制御する方法は 2 つあります。1 つは IP またはその他のパラメータを使用して同時実行を制御する方法、もう 1 つは単位時間あたりに処理されるリクエストの合計数を制御する方法です。つまり、同時実行性と並列処理の制御です。これら 2 つの機能は、それぞれ ngx_http_limit_conn_module モジュールと ngx_http_limit_req_module モジュールによって実装されます。

ngx_http_limit_conn_module モジュール

例示する

このモジュールは主に同時リクエストの数を制御するために使用されます。

パラメータ設定

制限接続ゾーン

コマンド設定 limit_conn_zone キー zone=name:size
構成コンテキスト: http
注: キーはNginxの変数で、通常はbinaryremoteaddr|server_nameです。名前は共有メモリの名前、サイズは共有メモリのサイズです。この設定は共有メモリスペース名に適用され、キーのアクセスステータスを保存します。

制限接続ログレベル

構文: limit_conn_log_level info|notice|warn|error
デフォルト値: エラー
構成コンテキスト: http、サーバー、場所
注意:アクセスが上限に達すると、アクセス状況がログに記録されます

制限接続

構文: limit_conn zone_name number
構成コンテキスト: http、サーバー、場所
注意: アクセス同時実行制御には zone_name を使用します。この数値を超えると、対応するエラー コードが返されます。

制限接続ステータス

構文: limit_conn_status コード
デフォルト値: 503
構成コンテキスト: http、サーバー、場所
説明: アクセスが制限数を超えると、クライアントにエラー コードが返されます。このエラー コードは、error_page などのパラメータとともに使用して、アクセスが制限数を超えたときにクライアントにわかりやすいエラー ページを返すことができます。

制限レート

構文: limit_rate レート
デフォルト値: 0
構成コンテキスト: http、サーバー、場所
説明: 各リンクのレートを制限します。レートは 1 秒あたりのダウンロード速度を示します。

制限レート後

構文: limit_rate_after サイズ
構成コンテキスト: http、サーバー、場所
注意: このコマンドは limit_rate と一緒に使用されます。トラフィックがサイズを超えると、limit_rate が有効になります。

簡単な設定例

limit_conn_zone $binary_remote_addr ゾーン=addr:10m;
サーバー{
  聞く 80;
  サーバー名 www.domain.com;
  ルート /path/;
  インデックス index.html index.htm;
  場所 /ip {
   limit_conn_status 503; # 制限を超えた後に返されるステータス コード。
   limit_conn_log_level warn; # ログレベル limit_rate 50; # 帯域幅制限 limit_conn addr 1; # 同時アクセスの制御}
  # 同時アクセス制限を超えると、503 エラー ページ error_page 503 /503.html が返されます。
}

ngx_http_limit_req_module モジュール

例示する

このモジュールは主に単位時間あたりのリクエスト数を制御します。フィルタリングには「リーキー バケット」アルゴリズムを使用します。制限レートを設定した後、単位時間あたりのリクエスト数がレートを超えると、モジュールはバースト値を検出します。値が 0 の場合、リクエストはエラーを返すか、delay|nodelay 構成に従って待機します。バーストが 0 より大きい場合、リクエスト数がレートより大きくバーストより小さい場合、リクエストは処理待ちキューに入ります。

パラメータ設定

制限要件ゾーン

構文: limit_req_zone key zone=name:size rate=rate
構成コンテキスト: http
注: key は Nginx の変数で、通常は binaryremoteaddr|server_name です。name は共有メモリの名前、size は共有メモリのサイズ、rate はアクセス頻度で、単位は r/s、r/m です。この設定は共有メモリ空間名に適用され、$key のアクセス状態を保存します。

制限要件

構文: limit_rate zone=name [burst=number] [nodelay|delay=number]
構成コンテキスト: http、サーバー、場所
注: 制限を有効にし、バーストの最大容量を設定し、リクエストが制限を超えた場合に処理を待機するか、エラー コードを返すかを決定します。

limit_req_log_level および limit_req_status 構成パラメータは、ngx_http_limit_conn_module モジュールと一致しています。

簡単な設定例

limit_req_zone $binary_remote_addr ゾーン=req:10m レート=2r/m;
サーバー{
  聞く 80;
  サーバー名 www.domain.com;
  ルート /path/;
  インデックス index.html index.htm;
  場所 / 制限 {
   limit_req ゾーン=req バースト=3 ノードレイ;
  }
  # 同時アクセス制限を超えると、503 エラー ページ error_page 503 /503.html が返されます。
}

知らせ

どちらのアクセス制御もメモリ空間の確保が必要です。メモリ空間がある以上、当然メモリが不足する状況が発生します。このとき、新しいリクエストはエラーで返されます。そのため、アクセス制限を有効にする場合は、このような状況が発生しないように監視する必要があります。

まとめ

Nginx のモジュール アーキテクチャを簡単に紹介し、ngx_http_limit_conn_module モジュールと ngx_http_limit_req_module モジュールの機能と構成パラメータを理解することに重点を置き、Nginx のリクエストの同時実行制御を実装します。何か問題があればお知らせください

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx でグレースケールリリースを実装する 3 つの方法の概要
  • Asp.Net Core の公開と展開の詳細な説明 (MacOS + Linux + Nginx)
  • nginx がリリースしたばかりの JavaScript 機能、nginScript の簡単な分析
  • nginx を使用したプロキシ サーバーの設定
  • Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)
  • Nginx proxy_redirect の使用方法の詳細な説明
  • 指定したディレクトリに nginx をインストールする方法の例
  • Linux システムで IPv6 をサポートするように Nginx を設定する方法
  • VueとNginxをベースにしたフロントエンドとバックエンドのデプロイメントチュートリアルの詳細な説明
  • nginx を使用してカナリアリリースをシミュレートする方法

<<:  Vue+element+oss はフロントエンドのフラグメントアップロードとブレークポイント再開を実現します

>>:  Centos6にMysql5.7をインストールする方法

推薦する

MySQL データベースで機密データの暗号化と復号化を実装する方法

目次1. 準備2. MySQL暗号化関数方式2.1 MySQL 暗号化2.2 MYSQL 復号化3....

Vue ライフサイクルの紹介とフック関数の詳細な説明

目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...

MySQL における in と exists の違いの詳細な説明

1. 事前に準備する便宜上、ここで 2 つのテーブルを作成し、そこにいくつかのデータを追加します。果...

mysql 変数の使用例の分析 [システム変数、ユーザー変数]

この記事では、例を使用して MySQL 変数の使用方法を説明します。ご参考までに、詳細は以下の通りで...

JS 正規マッチングの落とし穴の記録

最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か...

ElementUIカスタムCSSスタイルが有効にならない問題を解決する

例えば、入力ボックスがあります <el-入力 ref="mySearch"...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

MySQLデータストレージプロセスパラメータの詳細な例

MySQL ストアド プロシージャ パラメータには、in、out、inout の 3 種類があります...

UbuntuでMySQLデータベースファイルディレクトリを変更する方法

序文同社の Ubuntu サーバーは、さまざまなシステムのディレクトリを異なる論理パーティションに配...

JS におけるメモリと変数の保存についての詳細な説明

目次序文JSマジックナンバー数値の保存バイナリ変換方法なぜ 0.1 + 0.2 !== 0.3 なの...

HTMLはマウスをホバーしたときにテキストを表示するためにtitle属性を使用します。

コードをコピーコードは次のとおりです。 <a href=# title="ここに表示...

Vue3とElectronを使ったデスクトップアプリケーションの詳しい説明

目次Vue CLIはVueプロジェクトを構築しますVue プロジェクトをマークダウン エディターに変...

Docker プライベート ウェアハウスを構築する (自己署名方式)

作成したイメージを一元管理し、サービスの展開を容易にするために、プライベート Docker リポジト...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル (Windows 版)

1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...

Vueコンポーネントの動的コンポーネントの詳細な説明

目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...