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 における無効な Null セグメント判定と IFNULL() 失敗の解決策

MySql Nullフィールド判定とIFNULL失敗処理ps: (プロセスを表示したくない場合は、S...

画像の色を変更するための純粋なCSS

画像の色を変更するための CSS テクニックは非常にシンプルです。具体的なコードは次のとおりです。ヒ...

js の toString メソッドの 3 つの機能

目次1. toStringメソッドの3つの機能2. オブジェクトを表す文字列を返す3. カスタム t...

Docker ビルド PHP 環境チュートリアル詳細説明

Dockerのインストール公式インストールスクリプトを使用して最新バージョンのDockerをインスト...

面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...

Reactはルーティングを使用してログインインターフェースにリダイレクトします

前回の記事では、webpack と react 環境を設定した後、ログイン インターフェースとその後...

MySQL 5.7.17 のインストールと使用方法のグラフィックチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

レスポンシブ Web をデザインするにはどうすればいいですか?レスポンシブウェブデザインのメリットとデメリット

最近レスポンシブ デザインについて学んでいて、これについていくつか整理してみました。写真の一部はイン...

Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例

この記事は主に、Nginx のフォワード プロキシとリバース プロキシ、および負荷分散機能の設定コー...

Nginx セッション共有問題の解決策の分析

この記事は主に、Nginx セッション共有の問題に対する解決策を紹介します。記事内のサンプル コード...

例を通してMySQLパーティションテーブルの原理と一般的な操作を学びます

1. パーティションテーブルの意味パーティション テーブル定義は、任意のサイズに設定できるルールに従...

iframe の多層ネスト、無制限のネスト、高度に適応したソリューション

ページ A、B、C の 3 つがあります。ページ A にはページ B が含まれ、ページ B にはペー...

VUEはFlappy Birdゲームのサンプルコードを実装します

Flappy Bird は、誰もがアプリでプレイしたことがある非常にシンプルな小さなゲームです。ここ...

docker を使用して Kong クラスター操作を構築する

docker コンテナの下に kong クラスターを構築するのは非常に簡単です。公式サイトの紹介も非...

特定の部門 ID に基づいて、すべての下位レベルの複数レベルのサブ部門を照会する MySQL の例

シミュレーションテーブルとデータスクリプト次の SQL ステートメントをコピーして、sys_dept...