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製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

推薦する

MySQL データベースのインポートとエクスポートのデータ エラーの解決例の説明

データのエクスポートエラーを報告する 「secure_file_priv」のような変数を表示します。...

さまざまな MySQL テーブルソートルールのエラーの分析

MySQL が複数のテーブルを結合するときに、次のエラーが報告されます: [Err]1267 – 操...

DockerにRedisをインストールし、パスワードを設定して接続する方法

Redis は分散キャッシュ サービスです。キャッシュは、大規模システムの開発やパフォーマンスの最適...

新しいカーネルをLinuxシステムに移植する手順

1. ubuntu16.04 イメージと対応する ubuntu16.04 カーネル バージョンのソー...

Alibaba Cloud サーバーの購入とインストール方法

1. サーバーを購入するこの例では、購入したサーバーはAlibaba Cloudです。大学生はAli...

CSSテーマを簡単に切り替える方法の詳細な説明

最近、個人の Web サイトに非常にシンプルなカラー スキーム (テーマ) スイッチャーを追加しまし...

テキストエリアの disabled 属性と readonly 属性の具体的な使用法

障害者の定義と使用法disabled 属性はブール属性です。 disabled 属性は、テキスト領域...

MySQL ビューの原則分析

目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...

Linux システムでの Selenium クローラー プログラムの導入の概要

目次序文1. セレンとは何ですか? 2. 使用手順1. ライブラリをインポートする2. テストコード...

MySQL インデックス プッシュダウンを 5 分で理解する

目次インデックス プッシュダウンとは何ですか?インデックスプッシュダウン最適化の原理インデックスプッ...

mysqlを使用して、URLから返されたhttp GETリクエストデータを記録します。

ビジネスシナリオの要件と実装ロジックの分析ビジネスでは、HTTP GET を使用してデータを要求する...

Ubuntu Server 16.04 MySQL 8.0 のインストールと設定のグラフィックチュートリアル

Ubuntu Server 16.04 MySQL 8.0 のインストールと設定のグラフィックチュー...

mysql 5.7.18 winx64 無料インストール設定方法

1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...

CSSアニメーション効果アニメーションの一般的なスタイル

アニメーションアニメーションを定義します。 /*アニメーションの各ステップで実行されるアクションを定...

Unicodeの一般的な記号

Unicode は、世界中のすべてのテキストと記号に対応できる国際組織によって開発された文字エンコー...