ホームページ >Java >&#&チュートリアル >Nginx+SpringBootで負荷分散を実現する方法

Nginx+SpringBootで負荷分散を実現する方法

WBOY
WBOY転載
2023-05-29 17:28:061530ブラウズ

負荷分散の概要

nginx の負荷分散実装を紹介する前に、負荷分散の分類について簡単に説明します。負荷分散の分類は、主にハードウェア負荷分散と負荷分散に分けられます。ソフトウェア ロード バランシング。ハードウェア ロード バランシングは、特殊なソフトウェアとハ​​ードウェアを使用するデバイスです。機器ベンダーは、データの安定性とセキュリティの点で非常に信頼性の高い、f5 などの完全で成熟したソリューションを提供しますが、ソフトウェアよりも高価です。 ; ソフトウェア負荷分散は主に、メッセージ キュー分散メカニズムを実装する nginx などのソフトウェアに基づいています。

簡単に言えば、いわゆる負荷分散とは、多くのリクエストを迂回し、それらを別のサーバーに割り当てて処理することです。たとえば、a、b、c という 3 つのサーバーがあり、負荷分散とポーリング戦略に nginx を使用します。この時点で 9 つのリクエストを受信した場合、9 つのリクエストは a と b に均等に分散されます。 cf サーバーでは、各サーバーが 3 つのリクエストを処理するため、複数のマシン クラスターの特性を利用して単一サーバーへの負荷を軽減できます。

負荷分散を実装する nginx の図の例:

Nginx+SpringBootで負荷分散を実現する方法

負荷分散戦略

nginx オープン ソースは 4 つのタイプをサポートしますnginx plus ではさらに 2 つのメソッドが追加されています。

1.round robin:

すべてのリクエストに対するリクエストのポーリングと送信、デフォルトの割り当て方法。

nginx.conf 設定例:

注: 上記のドメイン名は ip に置き換えることもできます。

2.最小接続数:

サーバーの重みも考慮して、アクティブな接続数が最も少ないサーバーにリクエストを送信します。

nginx.conf 設定例:

3.ip ハッシュ:

リクエストを送信するサーバーは、クライアントの IP アドレスによって決まります。この場合、ハッシュ値は、ipv4 アドレスの最初の 3 バイトまたは ipv6 アドレス全体を使用して計算されます。この方法では、サーバーが使用不可でない限り、同じアドレスからのリクエストが同じサーバーに到達することが保証されます。

4.generic hash:

リクエストの送信先サーバーは、テキスト文字列、変数、またはユーザー定義のキーによって決定されます。組み合わせ。

5.最小時間 (nginx plus のみ)

各リクエストに対して、nginx plus は平均レイテンシーが最も低く、アクティブな接続数が最も少ないサーバーを選択します。最小の平均レイテンシは、least_time ディレクティブを含む次のパラメータに基づいて計算されます。

  • header: サーバーから最初のバイトを受信するまでの時間。

  • last_byte: サーバーから完全な応答を受信する時間。

  • last_byte inflight: サーバーから完全な応答を受信する時間。

6.random:

各リクエストは、ランダムに選択されたサーバーに配信されます。 2 つのパラメーターが指定された場合、nginx はまずサーバーの重みに基づいて 2 つのサーバーをランダムに選択し、次に指定された方法を使用してそのうちの 1 つを選択します。

  • least_conn: アクティブな接続の最小数

  • least_time=header (nginx plus): から応答ヘッダーを受信するまでの最小平均時間サーバー ($upstream_header_time)。

  • least_time=last_byte (nginx plus) : サーバーから完全な応答を受信するまでの最短平均時間 ($upstream_response_time)。

nginx springboot は負荷分散を実装します

環境の準備

  • 依存関係jdk1.8 以降のバージョン;

  • nginx 環境に依存します;

ここのプロジェクトは以前の Springboot を使用しますプロジェクト、springboot プロジェクトのアドレス: https://github.com/xuwujing/springboot-study/tree/master/springboot-thymeleaf

最初にこのプロジェクトをダウンロードし、次のように入力します: mvn clean packageプロジェクトを jar ファイルにパッケージ化し、application.properties とこの jar プロジェクトをフォルダーに配置し、そのフォルダーをコピーします (わかりやすくするためにここにコピーしています。実際には、変更されたポートはコピーしません) 再起動も OK )、コピーしたフォルダー application.properties のポートを、たとえば 8086 に変更します。

nginx 構成

nginx/conf/nginx.conf ディレクトリにある nginx 構成ファイル nginx.conf を見つけて、変更します。この設定では、次の設定を追加します:

  • upstream pancm: 任意の名前を定義します;

  • server ip: port またはドメイン名;

ラウンドロビン戦略を使用したくない場合は、別の戦略に変更することもできます。

次に、サーバー上で次の構成を追加/変更します:

構成手順:

  • サーバー: 仮想ホストの名前。複数の構成を使用できます。 1 つの http サーバーで構成する;

  • listen: nginx のデフォルト ポート;

  • server_name: nginx サービスのアドレス、ドメインを使用できます複数の名前はスペースで区切られます。

  • proxy_pass: プロキシ パス、通常は負荷分散を実現するためにアップストリームの後に名前を設定します。ジャンプ用の IP を直接設定できます。

nginx.conf 完全な設定:

負荷分散テスト

nginxの設定が完了したら、nginxを起動します。
linux input/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf、すでに開始されている場合は、/を使用できます。 usr/local/nginx /sbin/nginx -s reload コマンドを使用して構成ファイルをホットロードします。Windows では、nginx.exe または cmd を直接クリックして、start nginx を実行します。 開始します。開始した場合でも、ホット ロードに nginx -s reload を使用できます。

nginx が起動したら、ダウンロードした Springboot を起動し、プロジェクトをコピーしてポートを変更します。java -jar springboot-jsp-thymeleaf.jar と入力して開始します。

すべてが正常に開始されたら、ブラウザにサービスの IP アドレスを入力してアクセスできます。

サンプル画像:

Nginx+SpringBootで負荷分散を実現する方法

注: ここではテストに Windows システムを使用していますが、実際の Linux も同じです。

次に、コンソール ログを表示します。

Nginx+SpringBootで負荷分散を実現する方法

上記の例の図では、4 つのインターフェイス更新リクエストを作成し、最終的に 2 つのサービスに均等に分散し、上記のテスト結果から負荷分散を実現しました。

ここではnginxを使用する際の注意点についてお話しますが、学習やテストの場合は負荷分散を実現するためにnginxのデフォルトポートを使用しても通常は問題ありませんが、プロジェクトで使用する場合は特に注意が必要です。インターフェイスにログインするときにポートが 80 でない場合、ログイン インターフェイスをリダイレクトできません。デバッグ時に net::err_name_not_resolved のようなエラーが表示されます。これは、nginx のデフォルトのポートが 80 であるためです。デフォルトのジャンプはこれにも当てはまります。そのため、これが発生した場合は、location の下に proxy_set_header host $host:port 設定を追加する必要があります。ポートとリッスン ポートの一貫性を保つだけです。

以上がNginx+SpringBootで負荷分散を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。