Nginxの現在の制限設定の詳細な説明

Nginxの現在の制限設定の詳細な説明

この記事では、最も単純なものから最も複雑なものまで、Nginx の現在の制限構成を例を使って説明します。これは、簡潔な公式ドキュメントを補足するものです。

Nginx は、リーキー バケット アルゴリズムを使用して電流を制限します。アルゴリズムに興味がある場合は、まず Wikipedia で読んでみてください。ただし、このアルゴリズムを理解していなくても、この記事の読み方には影響はありません。

空のバケツ

最も単純な電流制限構成から始めましょう。

limit_req_zone $binary_remote_addr ゾーン=ip_limit:10m レート=10r/s;

サーバー{
  場所 /ログイン/ {
    limit_req ゾーン=ip_limit;
    proxy_pass http://login_upstream;
  }
}

  • $binary_remote_addr はクライアント IP のフローを制限します。
  • zone=ip_limit:10m 現在の制限ルールの名前は ip_limit で、IP アドレスに対応する現在の制限ステータスを記録するために 10 MB のメモリ領域が許可されます。
  • レート=10r/s 現在の制限は1秒あたり10リクエストです
  • 場所 /login/ ログインフローを制限する

レート制限は 1 秒あたり 10 リクエストです。アイドル状態の nginx に 10 リクエストが同時に到着した場合、それらはすべて実行できますか?

リーキー バケットは、一定の割合でリクエストをリークします。 10r/s が一定速度であるのはなぜですか? 100 ミリ秒ごとに 1 つのリクエストがリークされます。

この構成では、バケットは空であり、リアルタイムでリークできないすべてのリクエストは拒否されます。

したがって、10 件のリクエストが同時に到着した場合、実行できるのは 1 件のリクエストのみで、他のリクエストは拒否されます。

これはあまり親切ではありません。ほとんどのビジネス シナリオでは、これらの 10 個のリクエストが実行できることが期待されます。

バースト

前のセクションの問題を解決するために設定を変更してみましょう。

limit_req_zone $binary_remote_addr ゾーン=ip_limit:10m レート=10r/s;

サーバー{
  場所 /ログイン/ {
    limit_req ゾーン=ip_limit バースト=12;
    proxy_pass http://login_upstream;
  }
}

burst=12 リーキーバケットのサイズは12に設定されます

論理的にはリーキー バケットと呼ばれ、実行できないリクエストを一時的にキャッシュする FIFO キューとして実装されます。

この方法により、リーク速度はリクエストあたり 100 ミリ秒のままですが、一時的に実行できない同時リクエストを最初にキャッシュすることができます。キューがいっぱいになった場合にのみ、新しいリクエストは拒否されます。

このように、リーキーバケツは流れを制限するだけでなく、ピークの低減と谷の埋め立ての役割も果たします。

この構成では、10 個のリクエストが同時に到着した場合、それらは 100 ミリ秒ごとに 1 つずつ順番に実行されます。

実行はされましたが、キュー実行により遅延が大幅に増加し、多くのシナリオでは依然として許容できない状態です。

遅延なし

遅延が長すぎることによる遅延の増加の問題を解決するために、構成の変更を続けます。

limit_req_zone $binary_remote_addr ゾーン=ip_limit:10m レート=10r/s;

サーバー{
  場所 /ログイン/ {
    limit_req ゾーン=ip_limit バースト=12 ノードレイ;
    proxy_pass http://login_upstream;
  }
}

Nodelay は、リクエストの実行を開始する時間を早めます。以前は、リクエストがバケットから漏れるまで実行が遅延されていました。現在は遅延がなく、リクエストがバケットに入るとすぐに実行が開始されます。

すぐに実行されるか拒否されるかのいずれかであり、電流制限により要求が遅延されることはありません。

リクエストは均一な速度でバケットから漏れ、バケットのスペースは固定されているため、平均して 1 秒あたり 5 件のリクエストが実行され、現在の制限の目的は達成されます。

しかし、これには欠点もあります。フローには制限がありますが、その制限はそれほど均一ではありません。上記の構成を例にとると、12 件のリクエストが同時に到着した場合、これらの 12 件のリクエストはすぐに実行され、後続のリクエストは均一な速度でのみバケットに入り、100 ミリ秒ごとに 1 件のリクエストが実行されます。一定期間リクエストがなく、バケットが空の場合、12 個の同時リクエストが同時に実行される可能性があります。

ほとんどの場合、この不均一な電流制限は大きな問題にはなりません。ただし、nginx には同時実行数を制御するパラメータ、つまり nodelay リクエストも用意されています。

limit_req_zone $binary_remote_addr ゾーン=ip_limit:10m レート=10r/s;

サーバー{
  場所 /ログイン/ {
    limit_req ゾーン=ip_limit バースト=12 遅延=4;
    proxy_pass http://login_upstream;
  }
}

delay=4 はバケット内の5番目のリクエストから遅延を開始します

このように、遅延パラメータの値を制御することで、同時に実行できるリクエストの数を調整し、リクエストをより均等に分散することができます。一部のリソースを消費するサービスでは、この数を制御する必要があります。

参照

nginx.org/en/docs/http/ngx_http_limit_req_module.html を参照してください。
https://www.nginx.com/blog/rate-limiting-nginx/

要約する

上記は、編集者が紹介したNginxの現在の制限設定です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • ネットワークセグメント内の IP アドレスに対する Nginx の接続制限設定の詳細な説明
  • Nginx 急ぎ購入 電流制限構成 実装分析
  • Nginx の現在の制限と構成管理の実践記録

<<:  MySQL 8.0 の新機能の落とし穴と解決策についての簡単な説明 (要約)

>>:  Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

推薦する

Vite2とVue3を使用したウェブサイトの国際化を実現するプロセス全体

目次序文vue-i18nをインストールするロケールの設定getLangs.js の実装i18nインス...

非常に優れた CSS スキル 10 選のコレクションと共有

ここでは、CSS テクニックを巧みに使用することで、HTML を変更せずにブログやテンプレートの外観...

CSSの記述形式、モバイルページの基本構造の詳細な説明

1. CSSの記述形式1. インラインスタイルCSSコードを開始タグに直接記述することができます&l...

Layuiテーブル行のデータを動的に編集する

目次序文スタイル機能説明初期化コードイベントリスナーの追加リスナーツールバーモニターテーブル行ツール...

vue3 の setUp とリアクティブ関数の使用方法の詳細な説明

1. いつsetUpを実行するかvue3 ではメソッドを正常に使用できるようになったことは誰もが知っ...

ログインと登録を実現するSpringboot+VUE

この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...

Vue+elementuiはドロップダウンテーブルの複数選択と検索機能を実現します

この記事では、ドロップダウンテーブルの複数選択と検索を実現するためのvue+elementuiの具体...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

Linux システムでのルート ディレクトリ拡張の概要

1. Linuxディスクの状態を確認する df -lh lsblkコマンドは、使用可能なすべてのブロ...

CSS3 Flex エラスティックレイアウトのサンプルコードの詳細な説明

1. 基本概念 //任意のコンテナを Flex レイアウトとして指定できます。 。箱{ ディスプレイ...

クロスブラウザ開発体験のまとめ(I)HTMLタグ

ページにDOCTYPEを追加するブラウザによってタグやスタイルシートの解釈が異なるため、さまざまなブ...

nginxとバックエンドポート間の競合の解決策

質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...

Linux trコマンドの使用

1. はじめにtr はテキストの一部を変換または削除するために使用されます。 tr は transl...

フォーム内の無効なフォームフィールドの値を送信する方法 サンプルコード

フォーム内のフォーム フィールドが無効に設定されている場合、フォーム フィールドの値は送信されません...

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...