負荷分散の概要 Nginx の負荷分散実装を紹介する前に、負荷分散の分類について簡単に説明します。負荷分散は、主にハードウェア負荷分散とソフトウェア負荷分散に分かれます。ハードウェア負荷分散は、専用のソフトウェアとハードウェアを組み合わせて使用するデバイスです。機器ベンダーは、F5 などの完全で成熟したソリューションを提供します。これは、データの安定性とセキュリティの面で非常に信頼性が高いですが、ソフトウェアよりも高価です。ソフトウェア負荷分散は、主に Nginx などのソフトウェアに基づいており、メッセージ キュー分散メカニズムを実装しています。 簡単に言えば、負荷分散とは、多数のリクエストを転送し、異なるサーバーに割り当てて処理することです。たとえば、A、B、C の 3 つのサーバーがあり、ポーリング戦略を使用して Nginx で負荷分散を行っているとします。この時点で 9 つのリクエストを受信した場合、これらの 9 つのリクエストは A、B、Cf サーバーに均等に分散され、各サーバーは 3 つのリクエストを処理します。このように、複数のマシン クラスターの特性を利用して、単一のサーバーにかかる負荷を軽減できます。 負荷分散を実装する Nginx の例の図: 負荷分散戦略 NGINX Open Source では 4 つの負荷分散方法をサポートしており、NGINX Plus ではさらに 2 つの方法が追加されています。 1.ラウンドロビン: すべてのリクエストをポーリングして送信します。これがデフォルトの割り当て方法です。 nginx.conf の設定例: 上流 サーバー www.panchengming.com; サーバー www.panchengming2.com; } 注: 上記のドメイン名は IP に置き換えることもできます。 2. 接続数が最も少ない: サーバーの重みも考慮して、アクティブな接続数が最も少ないサーバーにリクエストを送信します。 nginx.conf の設定例: 上流 最小接続数; サーバー www.panchengming.com; サーバー www.panchengming2.com; } 3.IPハッシュ: リクエストが送信されるサーバーは、クライアントの IP アドレスによって決まります。この場合、ハッシュ値の計算には IPv4 アドレスの最初の 3 バイトまたは IPv6 アドレス全体が使用されます。この方法により、サーバーが利用できない場合を除き、同じアドレスからのリクエストが同じサーバーに到達することが保証されます。 上流 ip_ハッシュ; サーバー www.panchengming.com; サーバー www.panchengming2.com; } 4.汎用ハッシュ: リクエストが送信されるサーバーは、ユーザー定義のキーによって決定されます。ユーザー定義のキーは、テキスト文字列、変数、またはその組み合わせにすることができます。 上流 ハッシュ $request_uri は一貫しています。 サーバー www.panchengming.com; サーバー www.panchengming2.com; } 5. 最短時間(NGINX Plusのみ) NGINX Plus は、リクエストごとに、平均レイテンシが最も低く、アクティブな接続数が最も少ないサーバーを選択します。平均レイテンシの最小値は、least_time ディレクティブを含む次のパラメータに基づいて計算されます。
上流 least_time ヘッダー; サーバー www.panchengming.com; サーバー www.panchengming2.com; } 6. ランダム: 各リクエストはランダムに選択されたサーバーに渡されます。両方のパラメータが指定されている場合、NGINX は最初にサーバーの重みに基づいて 2 つのサーバーをランダムに選択し、次に指定された方法を使用してそのうちの 1 つを選択します。
上流 ランダム2 least_time=last_byte; サーバー www.panchengming.com; サーバー www.panchengming2.com; } 負荷分散を実現するNginx+SpringBoot 環境の準備
このプロジェクトでは、私が以前に作成した SpringBoot プロジェクトを使用しています。SpringBoot のプロジェクト アドレスは次のとおりです: https://github.com/xuwujing/springBoot-study/tree/master/springboot-thymeleaf まず、プロジェクトをダウンロードし、 Nginx の設定 nginx/conf/nginx.conf ディレクトリにある nginx 設定ファイル nginx.conf を見つけて、設定を変更し、次の設定を追加します。 上流 pancm{ サーバー 127.0.0.1:8085; サーバー 127.0.0.1:8086; }
ラウンドロビン戦略を使用しない場合は、別の戦略に切り替えることができます。 次に、サーバー上で次の構成を追加/変更します。 サーバー{ 聞く 80; サーバー名 127.0.0.1; 位置 / { ルートhtml; proxy_pass http://pancm; proxy_connect_timeout 3秒; proxy_read_timeout 5秒; proxy_send_timeout 3秒; インデックス index.html index.htm; } エラーページ 500 502 503 504 /50x.html; 場所 = /50x.html { ルートhtml; } } 設定手順:
nginx.conf の完全な設定: イベント { ワーカー接続 1024; } error_log nginx-error.log 情報; http { mime.types を含めます。 デフォルトタイプ アプリケーション/オクテットストリーム; ファイル送信オン; キープアライブタイムアウト65; 上流 pancm{ サーバー 127.0.0.1:8085; サーバー 127.0.0.1:8086; } サーバー{ 聞く 80; サーバー名 127.0.0.1; 位置 / { ルートhtml; proxy_pass http://pancm; proxy_connect_timeout 3秒; proxy_read_timeout 5秒; proxy_send_timeout 3秒; インデックス index.html index.htm; } エラーページ 500 502 503 504 /50x.html; 場所 = /50x.html { ルートhtml; } } } 負荷分散テスト Nginx の設定が完了したら、Nginx を起動します。 Nginx を起動したら、ダウンロードした Springboot と、変更されたポートがコピーされたプロジェクトを順に起動し、 すべてが正常に起動したら、ブラウザにサービス IP を入力してアクセスできるようになります。 サンプル画像: 注: ここではテストに Windows システムを使用していますが、実際の Linux システムも同じです。 次にそれを実行して、コンソール ログを確認します。 上記の例の図から、4 つのインターフェース更新要求が行われ、最終的に 2 つのサービスに均等に分散されました。上記のテスト結果から、負荷分散が実現されました。 ここでは、Nginx を使用する際の注意事項について説明します。学習やテストの際には、一般的に nginx のデフォルト ポートを使用して負荷分散を実現しても問題ありません。ただし、プロジェクトで使用する場合、特にログイン インターフェイスがあり、ポートが 80 でない場合は、ログイン インターフェイスをリダイレクトできません。デバッグ時に、net::ERR_NAME_NOT_RESOLVED などのエラーが表示されます。これは、nginx のデフォルト ポートが 80 であり、デフォルトのジャンプもこれであるためです。したがって、このような場合は、location の下に proxy_set_header Host $host:port 構成を追加し、ポートと listen ポートが一致している必要があります。 上記は、負荷分散を実現するための Nginx+SpringBoot の例の詳細です。負荷分散を実現するための Nginx の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CentOS8 で MySQL 8.0 をインストールしてデプロイする方法
>>: Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します
FlashFXPのダウンロードアドレスは、https://www.jb51.net/softs/95...
公式サイトから mysql-5.7.19-winx64 をダウンロードします。これはシステムの 64...
Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...
以前は、境界線の長さをコンテナーよりも小さくする必要があったときに、div ネストを使用していました...
参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...
複数行のテキストがオーバーフローすると省略記号が表示されますこの記事では 2 つの方法を推奨します。...
目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...
注:記事に誤りがある場合は、メッセージを残して指摘してください。ご協力ありがとうございます。名前名前...
デバッグブランチプロジェクトの通常の開発中に、以前にリリースされたバージョンにバグがある場合がありま...
みなさんこんにちは。私は梁旭です。 Linux を使用するときに、計算を行う必要がある場合があり、そ...
JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...
この記事の例では、JavaScriptで等速アニメーションを実装するための具体的なコードを参考までに...
他のよりプロフェッショナルなブログ システムを参照すると、コード ブロックにコードのコピー ボタンが...
前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...
序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...