1 つの記事で Nginx の現在の制限を理解する (簡単な実装)

1 つの記事で Nginx の現在の制限を理解する (簡単な実装)

Nginx は現在、最も人気のあるロード バランサーの 1 つです。インターネット トラフィックの急激な増加に直面し、特に同時実行性の高いシナリオでは、インターフェイス電流制限も非常に重要です。 Nginx には、アクセス頻度の制限と同時接続数の制限という、フローを制限する主な 2 つの方法があります。

レート制限は、NGINX の最も便利な機能の 1 つですが、最も誤解され、誤って設定される機能の 1 つでもあります。この機能を使用すると、一定期間内にユーザーが実行できる HTTP リクエストの数を制限できます。リクエストは、ホームページの GET リクエストやログイン フォームの POST リクエストのように単純なものになります。
レート制限は、ブルートフォースパスワードクラッキング攻撃の速度を低下させるなど、セキュリティ目的にも使用できます。受信リクエストのレートを制限し、(ログ記録と組み合わせて) ターゲット URL をマークすることで、DDoS 攻撃から保護します。一般的に、電流制限は、上流のアプリケーション サーバーが同時に多数のユーザー要求によって圧倒されることを防ぐために使用されます。

NGINX レート制限の仕組み

NGINX スロットリングでは、帯域幅が制限されている場合のバーストを処理するために通信やパケット交換コンピュータ ネットワークで広く使用されているリーキー バケット アルゴリズムが使用されます。これは、上から水が満たされ、下から水が漏れているバケツに非常に似ています。水が満たされる速度が水が漏れる速度よりも速い場合、バケツは溢れてしまいます。

リクエスト処理プロセスでは、水はクライアントからのリクエストを表し、バケツは先入れ先出し (FIFO) アルゴリズムに従ってリクエストが処理されるのを待つキューを表します。漏れ水は、リクエストがバッファから出てサーバーによって処理されることを表し、オーバーフローは、リクエストがドロップされて処理されないことを表します。

1. アクセス頻度を制限する(通常のトラフィック)

Nginx では、リーキー バケット アルゴリズムの原理に基づいて、ngx_http_limit_req_module モジュールを使用してリクエストのアクセス頻度を制限します。次に、nginx の limit_req_zone および limit_req 命令を使用して、単一の IP のリクエスト処理レートを制限します。

構文: limit_req_zone key zone rate

  • 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 ミリ秒以内に別のリクエストが到着した場合、そのリクエストは拒否されます。

2. アクセス頻度を制限する(バーストトラフィック)

上記の構成では、トラフィックが急増した場合、過剰なリクエストは拒否され、バーストトラフィックを処理できなくなります。では、バーストトラフィックにはどのように対処すればよいのでしょうか? Nginx はバースト トラフィックの問題を解決するために burst パラメータを提供しており、nodelay パラメータと組み合わせて使用​​されます。バーストとは、設定された処理速度を超えた後に処理できる追加リクエストの数を意味します。

burst=20 nodelay は、これらの 20 のリクエストが遅延なく即座に処理されることを意味し、これは特別な事項の特別な処理に相当します。ただし、これらの 20 件のバースト要求がすぐに処理されたとしても、後続の要求はすぐには処理されません。 burst=20 は、キャッシュ キューの 20 スロットを占有するのと同じです。リクエストが処理されたとしても、これらの 20 スロットは 100 ミリ秒ごとに 1 つずつしか解放できません。これにより、安定したレートの効果が得られるだけでなく、突然のトラフィックフローにも正常に対処できるようになります。

3.同時接続数を制限する

Nginx の ngx_http_limit_conn_module モジュールは、リソース接続の数を制限する機能を提供します。これは、limit_conn_zone および limit_conn 命令を使用して実行できます。

limit_conn perip 20: 対応するキーは $binary_remote_addr です。これは、単一の IP が同時に保持できる接続が最大 20 に制限されていることを意味します。 limit_conn perserver 100: 対応するキーは $server_name で、仮想ホスト (サーバー) が同時に処理できる同時接続の合計数を示します。接続は、リクエスト ヘッダーがバックエンド サーバーによって処理された後にのみカウントされることに注意してください。

さて、上記の電流制限方法については理解できましたか?

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

以下もご興味があるかもしれません:
  • モジュールへのアクセスを制限するNginxの制限方法
  • nginx を使用して分散電流制限を実装する方法
  • Nginx サーバーが IP アクセスを制限するさまざまな状況の完全な分析
  • Nginxは、同じ期間内の特定のIPへの訪問とリクエストの数を制限します。サンプルコード
  • ネットワークセグメント内の IP アドレスに対する Nginx の接続制限設定の詳細な説明
  • nginx で limit_req レート制限を設定する例
  • Nginx で limit_req_zone を使用して同じ IP へのアクセスを制限する方法

<<:  JS を使用してクリップボード内の Excel コンテンツを解析する方法

>>:  win10でのmysql5.7.21解凍バージョンのインストールチュートリアル

推薦する

MySQL データベース内の同じテーブルを同時にクエリして更新する方法

通常のプロジェクトでは、1 回の入札で同時にデータを更新および照会する必要があるという問題によく遭遇...

3分でUbuntu 16.04を初期化し、Java、Maven、Docker環境をデプロイする

Fast-Linux プロジェクト アドレス: https://gitee.com/uitc/Fas...

HTML テーブル タグ チュートリアル (47): ネストされたテーブル

<br />このページでは、テーブルをネストすることで組版を実現しています。つまり、1 ...

無効な Nginx クロスドメイン設定 Access-Control-Allow-Origin の解決策

nginx バージョン 1.11.3次の構成を使用すると、検証は無効になり、クロスドメインの問題が依...

Tomcat のパフォーマンス最適化のための Apr モジュールの構築方法

序文Tomcat は、無数のチューニング オプションを備えた、広く使用されている Java Web ...

MySQL の frm ファイルからテーブル構造を復元する 3 つの方法 [推奨]

mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...

MySQL における ${param} と #{param} の違い

${param}によって渡されるパラメータは、テーブル名やフィールド名を渡すなど、SQL文の一部と...

CSSをiPhoneのフルスクリーンに適応させる方法

1. メディアクエリ方式 /*iPhone X への適応*/ @media 画面のみ、(デバイス幅:...

HTML テーブル マークアップ チュートリアル (38): ヘッダーの境界線の色属性 BORDERCOLOR

テーブルを美しくするために、ヘッダーに異なる境界線の色を設定できます。基本的な構文<TH 境界...

yum から docker インストール パッケージをダウンロードし、オフライン マシンにインストールする例の詳細なコード

1. ネットワークマシンでは、デフォルトのcentosyumソースを使用します [root@kole...

Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策

最近、Linux オペレーティング システムを使用して実行可能ファイルを実行していたところ、「そのよ...

JS の Promise に中止関数を追加する方法

目次概要プロミスレースメソッド約束の再パッケージ化中止コントローラAxiosプラグインにはキャンセル...

ネイティブ js でカスタム スクロール バーを実装する

この記事の例では、カスタムスクロールバーを実装するためのjsの具体的なコードを参考までに共有していま...

Javascript配列の重複排除のいくつかの方法の詳細な説明

目次アレイ重複排除1 2層forループ(バブルソートの2層ループ記述に類似) 2 ループとインデック...

Vue におけるキープアライブ マルチレベル ルーティング キャッシュの問題

目次1. 問題の説明2. 原因分析3. 解決策4. 処理1. 問題の説明調整センターでは、最後の 2...