Nginx+SpringBoot による負荷分散の実装例

Nginx+SpringBoot による負荷分散の実装例

負荷分散の概要

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 ディレクティブを含む次のパラメータに基づいて計算されます。

  • ヘッダー: サーバーから最初のバイトを受信した時刻。
  • last_byte: サーバーから完全な応答を受信した時刻。
  • last_byte inflight: サーバーから完全な応答を受信した時刻。
上流
least_time ヘッダー;
サーバー www.panchengming.com;
サーバー www.panchengming2.com;
}

6. ランダム:

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

  • least_conn : アクティブな接続の最小数
  • least_time=header (NGINX Plus): サーバーから応答ヘッダーを受信する最短平均時間 ($upstream_header_time)。
  • least_time=last_byte (NGINX Plus): サーバーから完全な応答を受信するまでの最小平均時間 ($upstream_response_time)。
上流
ランダム2 least_time=last_byte;
サーバー www.panchengming.com;
サーバー www.panchengming2.com;
}

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

環境の準備

  • JDK 1.8 以降に依存します。
  • Nginx 環境に依存します。

このプロジェクトでは、私が以前に作成した SpringBoot プロジェクトを使用しています。SpringBoot のプロジェクト アドレスは次のとおりです: https://github.com/xuwujing/springBoot-study/tree/master/springboot-thymeleaf

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

Nginx の設定

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

上流 pancm{
  サーバー 127.0.0.1:8085;
  サーバー 127.0.0.1:8086;
}
  • アップストリーム pancm: 名前を定義します。任意の名前でかまいません。
  • サーバー + IP:ポートまたはドメイン名;

ラウンドロビン戦略を使用しない場合は、別の戦略に切り替えることができます。

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

 サーバー{
    聞く 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;
    }
  }

設定手順:

  • サーバー: 仮想ホストの名前。1 つの http で複数のサーバーを設定できます。
  • listen: Nginx のデフォルト ポート。
  • server_name: Nginx サービスのアドレス。ドメイン名を使用できます。複数の名前はスペースで区切られます。
  • proxy_pass: プロキシパス。一般的には、負荷分散を実現するためにアップストリームが設定された後に名前が設定され、ジャンプ先の IP を直接設定することもできます。

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 を起動します。
Linux では、 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confと入力します。起動している場合は、 /usr/local/nginx/sbin/nginx -s reloadコマンドを使用して、構成ファイルをホット リロードできます。Windows では、Nginx ディレクトリのnginx.exeを直接クリックするか、 cmd start nginxを実行して起動します。起動している場合は、 nginx -s reloadを使用してホット リロードできます。

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

すべてが正常に起動したら、ブラウザにサービス 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 の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Docker Swarm のサービス検出と負荷分散の原則の詳細な説明
  • サーバー負荷分散とはどういう意味ですか(サーバー負荷分散の基本機能と実装原則)
  • ソフトウェア ロード バランサを使用して Web サーバー クラスターを実装する (iis+nginx)
  • Nginx ロードバランシングとは何か、そしてそれをどのように設定するか
  • ASP.NET Core 3.1 Ocelot 負荷分散の実装
  • Nginx + consul + upsync を使用して動的負荷分散を実現する方法の詳細な説明
  • Spring Cloudシリーズのロードバランシングリボンのサンプルコード
  • サービス検出と負荷分散の詳細について簡単に説明します

<<:  CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

>>:  Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

推薦する

FlashFXP FTP クライアント ソフトウェア登録クラッキング方法

FlashFXPのダウンロードアドレスは、https://www.jb51.net/softs/95...

Mysql 5.7.19 無料インストール版 (64 ビット) の設定方法に関する詳細なチュートリアル

公式サイトから mysql-5.7.19-winx64 をダウンロードします。これはシステムの 64...

ウェブサイトのユーザーエクスペリエンスデザイン(UE)

Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...

CSS 境界線の長さ制御機能の実装

以前は、境界線の長さをコンテナーよりも小さくする必要があったときに、div ネストを使用していました...

Vueナンバープレート検索コンポーネントの使い方の詳しい説明

参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...

CSS の複数行テキストがオーバーフローする場合の省略記号の例

複数行のテキストがオーバーフローすると省略記号が表示されますこの記事では 2 つの方法を推奨します。...

Reactでのこのリファレンスの詳細な説明

目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...

Linux lseek関数の使い方の詳しい説明

注:記事に誤りがある場合は、メッセージを残して指摘してください。ご協力ありがとうございます。名前名前...

Git サーバーを使用してデバッグ ブランチを表示し、修正する方法を 1 日 1 分で学習します。

デバッグブランチプロジェクトの通常の開発中に、以前にリリースされたバージョンにバグがある場合がありま...

Linux コマンドラインで電卓を使用する 5 つのコマンド

みなさんこんにちは。私は梁旭です。 Linux を使用するときに、計算を行う必要がある場合があり、そ...

JSscriptタグの属性は何ですか

JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...

均一なアニメーション効果を実現するJavaScript

この記事の例では、JavaScriptで等速アニメーションを実装するための具体的なコードを参考までに...

ウェブサイトのコードブロックのpreタグにコピーコードボタンコードを追加します

他のよりプロフェッショナルなブログ システムを参照すると、コード ブロックにコードのコピー ボタンが...

MySQL 5.7 でブロックポジショニング DDL の問題を解決する

前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...

Docker の MySQL コンテナのタイムゾーン問題の修正

序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...