NGINX 完全ガイドからの一部の章 | トラフィック管理とプログラマビリティ

原作者:デレク・デジョンヘ

元のリンク: 「NGINX 完全ガイド」の一部の章 | トラフィック管理とプログラマビリティ

転載元NGINXオープンソースコミュニティ


NGINX の唯一の公式中国語コミュニティ (すべてnginx.org.cn ) 

編集者注記 -オライリー発行の「The Complete Guide to NGINX」の中国語版 (2022 年の最新版) が正式にオンラインになりました。今すぐクリックして完全な電子版を無料でダウンロードしてください。

この 180 ページを超えるわかりやすい構成ガイドでは、NGINX のインストール方法から構成方法、アプリケーションのパフォーマンスのデバッグとトラブルシューティングの方法まで、すべてを説明します。それだけでなく、本書では、負荷分散、クラウド展開、自動化、コンテナとマイクロサービス、サービス メッシュ、セキュリティ保護、その他のシナリオに NGINX を使用するための関連する構成例も提供します。

この記事では、この本の中国語翻訳者である Xiong Ping が、この本の第 3 章「トラフィック管理」と第 5 章「プログラマビリティと自動化」からの素晴らしい一節を抜粋しています: A/B テスト、レート制限、ユニバーサル プログラミング言語拡張機能の使用NGINX。

A/B テスト

質問

クライアント トラフィックをファイルまたはアプリの 2 つ以上のバージョン間で分割して、受け入れまたはエンゲージメントをテストします。

解決

Split_clients モジュールを使用して、クライアント トラフィックの一部を別のアップストリーム プールに送信します。

split_clients "${remote_addr}AAA" $variant {
       20.0% "backendv2";
       *     "backendv1";
}

split_clients ディレクティブは、最初の引数として指定された文字列をハッシュし、そのハッシュ値を指定されたパーセンテージで除算して、2 番目の引数として指定された変数の値をマップします。「ユニバーサル ハッシュ ロード バランシング アルゴリズム」で説明されているように、これが複数の変数を含めることができる連結文字列であることを証明するために、最初のパラメーターに「AAA」が追加されます。

3 番目のパラメーターは、キーと値のペアを含むオブジェクトです。キーは重みの割合、値は割り当てられる値です。キーにはパーセンテージまたはアスタリスクを使用できます。アスタリスクは、すべてのパーセンテージを取得した後の残りを示します。$variant 変数の値の場合、backendv2 はクライアント IP アドレスへのトラフィックの 20% であり、backendv1 は残りの 80% です。

この例では、backendv1 と backendv2 はアップストリーム サーバー プールを表し、次のように proxy_pass ディレクティブとともに使用できます。

location / {
       proxy_pass http://$variant
}

変数 $variant を使用すると、トラフィックは 2 つの異なるアプリケーション サーバー プールに分散されます。

Split_clients の広範な用途を理解するために、2 つの静的サイト バージョン間でトラフィックを分割する例を見てみましょう。

http {
       split_clients "${remote_addr}" $site_root_folder {
              33.3% "/var/www/sitev2/";
              * "/var/www/sitev1/";
       }
       server {
              listen 80 _;
              root $site_root_folder; location / {
                     index index.html;
              }
       }
}

詳しい説明

このタイプの A/B テストは、電子商取引 Web サイトのさまざまな種類のマーケティングおよびフロントエンド機能のコンバージョン率をテストする場合に役立ちます。アプリケーションは通常、「グレースケール リリース」を介してデプロイされます。このタイプの展開では、新しいバージョンにルーティングされるユーザーの割合を徐々に増やすことで、ユーザーはトラフィックを新しいバージョンにゆっくりと切り替えることができます。コードの新しいバージョンをロールアウトする場合、エラーが発生した場合の影響を軽減するために、異なるアプリ バージョン間でクライアント トラフィックを分割すると便利です。

より一般的なデプロイメント モデルは Blue-Green デプロイメントです。これは、検証デプロイメント中に古いバージョンを引き続き使用できるようにしながら、ユーザーを新しいバージョンに切り替えることを意味します。クライアント トラフィックを 2 つの異なるアプリケーション セット間で分割する理由が何であれ、NGINX の Split_client モジュールを使用すると、それが簡単になります。

レート制限

質問

クライアントの IP アドレスなど、事前定義されたキーによるレート制限リクエスト。

解決

レート制限モジュールを使用してリクエスト レートを制限します。

http {
       limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s;
       # ...
       server {
              # ...
              limit_req zone=limitbyaddr;
              # ...
       }
}

この構成例では、limitbyaddr という名前の共有メモリ領域を作成します。使用される事前定義キーは、バイナリ形式のクライアント IP アドレスです。共有メモリ領域のサイズは10MBに設定されています。この領域では、キーワード引数を使用してレートを設定します。limit_req ディレクティブは、必須のキーワード引数、zone を使用します。

zone ディレクティブは、どの共有メモリ要求ゾーンを使用するかを示します。limit_req_status ディレクティブで定義されているように、明示的なレートを超えるリクエストは 429 HTTP コードを返します。デフォルト値は 503 であり、サーバーに問題があり、実際の問題はクライアントにあることを意味するため、ステータス コードを 400 レベルの範囲に設定することをお勧めします。

2 レベルのレート制限を有効にするには、limit_req ディレクティブのオプションのキーワード引数を使用します。

server {
       location / {
              limit_req zone=limitbyaddr burst=12 delay=9;
       }
}

場合によっては、クライアントは多くのリクエストを同時に実行し、一定期間速度を下げてからさらにリクエストを行う必要があります。burst キーワード引数を使用すると、クライアントが要求を拒否せずにレート制限を超えることを許可できます。レート制限を構成された値に一致させるために、レートを超えるリクエストは延期されます。

この動作を変更できるキーワード引数のセット、つまり、delay と nolay があります。nolay パラメータは値をとらず、クライアントはすべてのトラフィック バースト値を一度に消費することしか許可されません。ただし、レート制限要件が満たされるまで十分な時間待機する必要があり、満たさない場合はすべてのリクエストが拒否されます。

この例では、nolay を使用すると、クライアントは最初の 1 秒間に 12 個のリクエストを消費できますが、最初のリクエストの後、次のリクエストを行うまでに 4 秒待つ必要があります。遅延キーワード パラメーターは、スロットルなしで事前に発行できるリクエストの数を定義します。この場合、クライアントは遅延なく 9 つのリクエストを事前発行できますが、次の 3 つは調整され、その後 4 秒以内のリクエストは拒否されます。

詳しい説明

レート制限モジュールは非常に強力で、高速リクエストの乱用を防止しながら、すべての人に優れたサービスを提供します。リクエストレートを制限する理由はたくさんありますが、セキュリティもその 1 つです。ログイン ページのレートを厳しく制限することで、ブルート フォース攻撃を防ぐことができます。すべてのリクエストに適切な制限を設定して、悪意のあるユーザーがアプリへのサービスを拒否したり、リソースを浪費したりするのを防ぐことができます。

レート制限モジュールは接続制限モジュールとよく似た構成になっており、多くの同じ問題に悩まされています。1 秒あたりまたは 1 分あたりの速度を制限できます。レート制限に達すると、ログにイベントが記録されます。

さらに、この例では示されていないもう 1 つの命令があります:limit_req_log_level. そのデフォルト値は error. これを info、notice、warn に設定することもできます。NGINX Plus では、レート制限がクラスター対応になりました。

テストの制約は難しい問題になる可能性があり、テスト シナリオでは代替環境でのライブ トラフィックのシミュレーションが困難になることがよくあります。この場合、limit_req_dry_run ディレクティブを on に設定し、アクセス ログ内の変数 $limit_req_status を使用できます。$limit_req_status 変数は PASSED、REJECTED、または REJECTED_DRY_RUN として評価されます。

ドライ ランを有効にすると、実際に適用される前にライブ トラフィック ログを分析し、必要に応じて制限を調整して、制限が正しく設定されていることを確認できます。

汎用プログラミング言語で NGINX を拡張する

質問

汎用プログラミング言語を使用していくつかのカスタム拡張を実行するには、NGINX が必要です。

解決

C でカスタム NGINX モジュールを作成する前に、ユースケースが他のプログラミング言語のモジュールの使用に適しているかどうかを評価してください。C プログラミング言語は非常に強力で効率的な言語ですが、必要なカスタマイズをサポートできる言語モジュールは他にもたくさんあります。

NGINX では、モジュールを有効にするだけで JavaScript の機能を NGINX 構成に公開する NGINX JavaScript (NJS) が導入されています。Lua および Perl モジュールを使用することもできます。

これらの言語モジュールを使用する場合は、コードを含むファイルをインポートするか、構成内でコード ブロックを直接定義する必要があります。

Lua を使用するには、Lua モジュールと次の NGINX 構成をインストールして、インライン Lua スクリプトを定義します。

load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;
events {}
http {
      server {
             listen 8080;
             location / {
                    default_type text/html;
                    content_by_lua_block {
                           ngx.say("hello, world")
                    }
             }
       }
}

Lua モジュールは、ngx モジュールによって定義されたオブジェクトを通じて独自の NGINX API を提供します。NJS のリクエスト オブジェクトと同様に、ngx オブジェクトにもリクエストと操作の応答を記述するプロパティとメソッドがあります。

Perl モジュールがインストールされているこの例では、Perl を使用してランタイム環境から NGINX 変数を設定します。

load_module modules/ngx_http_perl_module.so;
events {}
       http {
             perl_set $app_endpoint 'sub { return $ENV{"APP_DNS_ENDPOINT"}; }';
             server {
                    listen 8080;
                    location / {
                           proxy_pass http://$app_endpoint
                    }
             }
       }
}

上記の例は、これらの言語モジュールが単に応答を返すだけでなく、より多くの機能を公開していることを示しています。perl_set ディレクティブは、Perl スクリプトから返されたデータに NGINX 変数を設定します。この例は制限されており、リクエスト プロキシ エンドポイントとして使用されるシステム環境変数を返すだけです。

詳しい説明

NGINX は拡張性が高いため、より多くの機能を有効にする可能性が広がります。NGINX は、C 言語モジュールを使用したカスタム コードを通じて拡張できます。C 言語モジュールは、ビルドの最初から NGINX にコンパイルすることも、構成に動的にロードすることもできます。

現在、JavaScript (njs)、Lua、および Perl の機能と構文を公開するモジュールがあります。ほとんどの場合、NGINX のカスタム機能が配布されていない限り、これらの既存のモジュールで十分です。現在、オープンソース コミュニティには、これらのモジュール用に構築された多くのスクリプトがあります。

このソリューションは、NGINX および NGINX Plus で利用可能な Lua および Perl スクリプト言語の基本的な使用法を示します。応答の検索、変数の設定、サブリクエストの送信、または複雑なオーバーライドの定義のいずれを行う場合でも、これらの NGINX モジュールはサポートされています。


NGINX の唯一の公式中国語コミュニティ (すべて nginx.org.cn )

NGINX 関連のその他の技術情報、インタラクティブな Q&A、一連のコース、およびイベント リソース: オープンソース コミュニティ公式 Web サイト |  WeChat 公式アカウント

IntelliJ IDEA 2023.3 と JetBrains Family Bucket の年次メジャー バージョン アップデート 新しいコンセプト「防御型プログラミング」: 安定した仕事に就く GitHub.com では 1,200 を超える MySQL ホストが稼働していますが、8.0 にシームレスにアップグレードするにはどうすればよいですか? Stephen Chow の Web3 チームは来月、独立したアプリをリリースする予定ですが、 Firefox は廃止されるのでしょうか? Visual Studio Code 1.85 リリース、フローティング ウィンドウ Yu Chengdong: ファーウェイは来年破壊的な製品を発売し、業界の歴史を書き換えるだろう 米国 CISA はメモリ セキュリティの脆弱性を排除するために C/C++ の廃止を勧告 TIOBE 12 月: C# がプログラミングになると予想30年前 雷軍が書いた論文「コンピュータウイルス判定エキスパートシステムの原理と設計」
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5246775/blog/10319488
おすすめ