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

推薦する

Ubuntu 18.04 Server バージョンのインストールと使用方法 (画像とテキスト)

1 システムのインストール手順OSバージョン:1804イメージのダウンロード: http://cd...

Linux でテキストを表示するためのヒント (非常に実用的!)

序文日常の開発では、サーバー上でさまざまなテキストやログの表示操作を実行する必要があることがよくあり...

ウェブサイトに最も必要なのは、ターゲットユーザーグループのエクスペリエンスを向上させることです。

「大河は東に流れ、波は歴代の英雄たちを洗い流した。古城の西側は三国時代の周朗の赤壁だと言われている...

docker で PostgreSQL データベースをインストールして永続化する方法

Dockerのインストール手順をスキップする1. postgresqlイメージを取得する docke...

Vueを使用して天気コンポーネントをロードする方法の詳細な説明

この記事では、Vueを使用して天気コンポーネントをロードする方法を参考までに紹介します。具体的な内容...

CSS を使用してデータ ホットスポット効果を実現する方法

効果は以下のとおりです。 分析する1. ここでは、点を囲む 3 つの円がズームアニメーションを実行し...

Linux での NTP サーバー設定の詳細な手順

目次1. 環境設定1.NTPサーバー2. ビジネスサーバー2. NTPサーバーの設定1. chron...

CocosCreator クラシック エントリー プロジェクト flappybird

目次開発環境ゲームエンジンのコンセプトCocos Creatorについてプロジェクト構造コード編集環...

MySQL 8.0.22 のインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 8.0.22のインストールと設定について記録します。具体的な内容は以下のとお...

MySQL 5.7 でデータベースのデータ保存場所を変更する方法

MySQL データベースに保存されるデータが徐々に増加すると、元のストレージ領域がいっぱいになり、M...

Node.js における非同期プログラミングの知識ポイントの詳細な説明

導入JavaScript はデフォルトでシングルスレッドであるため、コードは並列実行するための新しい...

LinuxにPHP7をインストールする方法の詳細な説明

Linux に PHP7 をインストールするにはどうすればいいですか? 1. 依存パッケージをインス...

VUE ユニアプリの基本コンポーネントの簡単な紹介

1. スクロールビュー垂直スクロールを使用する場合は、固定の高さを指定して CSS で高さを設定する...

背景のグラデーションと自動フルスクリーンを実現するCSSコード

背景グラデーションと自動フルスクリーンに関する CSS の問題編集長は CSS の開発中に致命的な問...

一般的な Nginx のテクニックと例の概要

1. 複数サーバーの優先順位たとえば、各サーバー ブロックがポート 80 をリッスンする場合、www...