Nginx ロードバランシング クラスタの実装

Nginx ロードバランシング クラスタの実装

(1)実験環境

youxi1 192.168.5.101 ロードバランサー

youxi2 192.168.5.102 ホスト1

youxi3 192.168.5.103 ホスト2

(2)Nginxの負荷分散戦略

Nginx ロード バランシングは、アップストリーム テンプレートで定義されたバックエンド サーバー リストからサーバーを選択して、ユーザー リクエストを受信するために使用されます。基本的なアップストリーム モジュールは次のとおりです。

アップストリーム [サーバーグループ名]{
  server [IPアドレス]:[ポート番号];
  server [IPアドレス]:[ポート番号];
  ....
}

アップストリーム モジュールを構成した後、次の形式でサーバー リストへのアクセス リバース プロキシを指定する必要があります。

場所 ~ .*$ {
  インデックス index.jsp index.html;
  proxy_pass http://[サーバーグループ名];
}

拡張機能: nginx ロケーション構成ルール: https://www.jb51.net/article/182472.htm

これにより、最も基本的な負荷分散は完了しますが、実際のニーズを満たすことはできません。現在、Nginx のアップストリーム モジュールは、ポーリング (デフォルトの方法)、重み付け (重み付け方法)、ip_hash (IP 割り当て方法に基づく)、least_conn (最小接続方法)、fair (サードパーティが提供する応答時間方法)、url_hash (サードパーティによって渡された URL 割り当て方法に基づく) の 6 つの負荷分散戦略 (アルゴリズム) をサポートしています。

1) 投票

最も基本的な構成方法は、アップストリーム モジュールのデフォルトの負荷分散戦略です。各リクエストは時系列順に異なるバックエンド サーバーに均等に分散されます。パラメータは次のとおりです。

失敗タイムアウトmax_failsと組み合わせて使用​​する
最大失敗回数fail_timeout パラメータで設定された時間内の失敗の最大数。この時間内にサーバーへのすべてのリクエストが失敗した場合、サーバーはダウンしていると見なされます。
失敗時間サーバーがダウンしていると見なされる時間の長さ。デフォルトは 10 秒です (サーバーがダウンしていると見なされる間隔)
バックアップサーバーをスタンバイ サーバーとしてマークします。プライマリサーバーが停止すると、リクエストはプライマリサーバーに送信されます
サーバーを永久にダウン状態にする

注: 1. ダウンとマークされたサーバーは自動的に削除されます。2. ポーリングがデフォルトです。3. この戦略は、ステートレスサーバー構成と短いフラットブロックを持つサービスに適しています。

2) 重量

加重方式では、ポーリング戦略に基づいてポーリングの確率を指定します。投票に基づいて重みパラメータが追加されることも考えられます。このパラメータは投票の確率を指定し、その値は数値です。アップストリーム モジュール構成テンプレートは次のとおりです。

アップストリーム [サーバーグループ名]{
  server [IPアドレス]:[ポート番号] weight=2;
  server [IPアドレス]:[ポート番号];
  ....
}

この例では、重みパラメータのないサーバーのデフォルト値は 1 です。重み値はアクセス率に比例します。すべての重み値の合計がサイクル単位となり、サーバー自身の重み値はサイクル単位内のポーリング回数となります。

注: 1. 重みが高いほど、割り当てられるリクエストの数が多くなります。2. この戦略は、least_conn 戦略および iphash 戦略と組み合わせて使用​​できます。3. この戦略は、サーバーのハードウェア構成に大きな違いがある場合に適しています。

3) ip_ハッシュ

IP 割り当て方法に応じて、ロード バランサーはクライアント IP に基づいて割り当てられるように指定されます。この方法により、同じクライアント要求が常に同じサーバーに送信され、セッションが確保されます。この方法では、各訪問者が固定のバックエンド サーバーにアクセスするため、セッションがサーバーを越えられないという問題を解決できます。アップストリーム モジュール構成テンプレートは次のとおりです。

アップストリーム [サーバーグループ名]{
  ip_ハッシュ;
  server [IPアドレス]:[ポート番号] weight=2;
  server [IPアドレス]:[ポート番号];
  ....
}

注意: 1. nginx 1.3.1 より前のバージョンでは、ip_hash の重みを使用できません。2. ip_hash はバックアップと同時に使用できません。3. この戦略は、セッションなどのステートフル サービス プログラムに適しています。4. サーバーを削除する必要がある場合は、手動でシャットダウンする必要があります。

4) 最小接続

最小接続モードでは、接続数が最も少ないバックエンド サーバーにリクエストが送信されます。ポーリングは、各バックエンドにリクエストを均等に分散し、負荷がほぼ同じになるようにします。ただし、一部のリクエストは時間がかかり、リクエストが配置されているバックエンドに大きな負荷がかかります。この場合、least_conn はより優れた負荷分散効果を実現できます。アップストリーム モジュール構成テンプレートは次のとおりです。

アップストリーム [サーバーグループ名]{
  最小接続数;
  server [IPアドレス]:[ポート番号] weight=2;
  server [IPアドレス]:[ポート番号];
  ....
}

注: この戦略は、処理時間が異なるリクエストに異なる時間がかかる、サーバーが過負荷になっている状況に適しています。

5) 公平

応答時間方式: リクエストはサーバーの応答時間に応じて割り当てられ、応答時間が短いリクエストが優先されます。アップストリーム モジュール構成テンプレートは次のとおりです。

アップストリーム [サーバーグループ名]{
  server [IPアドレス]:[ポート番号] weight=2;
  server [IPアドレス]:[ポート番号];
  ....
  公平;
}

注意: サードパーティのプラグインをインストールする必要があります。

6) url_ハッシュ

URL 分散方式は、アクセスされた URL のハッシュ結果に応じてリクエストを分散し、各 URL が同じバックエンド サーバーに送信されるようにします。キャッシュ ヒットと組み合わせて使用​​する必要があります。同じリソースに対する複数のリクエストが異なるサーバーに到着する可能性があり、その結果、不要な複数のダウンロード、低いキャッシュヒット率、およびリソース時間の浪費が発生します。 url_hash を使用すると、同じ URL (つまり、同じリソース要求) が同じサーバーに到達できます。リソースがキャッシュされると、要求を再度受信したときにキャッシュから読み取ることができます。アップストリーム モジュール構成テンプレートは次のとおりです。

アップストリーム [サーバーグループ名]{
  $request_uri をハッシュします。
  server [IPアドレス]:[ポート番号] weight=2;
  server [IPアドレス]:[ポート番号];
  ....
}

注意: 1. サードパーティのプラグインをインストールする必要があります。2. uri は小文字の L ではなく i です。

(3)実験

1) ロードバランサーyouxi1にnginxをコンパイルしてインストールする

nginxの依存関係をインストールする

[root@youxi1 ~]# yum -y インストール gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel

nginxソースパッケージnginx-1.14.1.tar.gzをアップロードし、解凍してインストールします。

[root@youxi1 ~]# tar xf nginx-1.14.1.tar.gz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/nginx-1.14.1/
[root@youxi1 nginx-1.14.1]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module
[root@youxi1 nginx-1.14.1]# make && make install
[root@youxi1 nginx-1.14.1]# echo $?
0

パラメータの説明:

--with-http_dav_module は、ngx_http_dav_module サポートを有効にします (PUT、DELETE、MKCOL: コレクションの作成、COPY および MOVE メソッドを追加)。デフォルトでは無効になっており、コンパイル時に組み込む必要があります。

--with-http_stub_status_module、ngx_http_stub_status_module サポートを有効にします (前回の起動以降の nginx の動作ステータスを取得します)。

--with-http_addition_module、ngx_http_addition_module サポートを有効にします (出力フィルターとして、不完全なバッファリングと部分的な応答要求をサポートします)。

--with-http_sub_module、ngx_http_sub_module サポートを有効にします (nginx 応答内のテキストを他のテキストに置き換えることができます)。

--with-http_flv_module、ngx_http_flv_module サポートを有効にします (時間ベースのオフセット ファイルを使用してメモリへのシークを提供します)。

--with-http_mp4_module は、mp4 ファイルのサポートを有効にします (メモリ内の時間ベースのオフセットを使用してファイルへのシークを提供します)。

nginx ユーザーを生成する

[root@youxi1 nginx-1.14.1]# useradd -M -s /sbin/nologin nginx

起動して自動起動を追加する

[root@youxi1 nginx-1.14.1]# /usr/local/nginx/sbin/nginx
[root@youxi1 nginx-1.14.1]# echo /usr/local/nginx/sbin/nginx >> /etc/rc.local
[root@youxi1 nginx-1.14.1]# chmod +x /etc/rc.d/rc.local

ファイアウォールがオンになっている場合は、ポート番号を忘れずに追加してください

[root@youxi1 nginx-1.14.1]# ファイアウォール-cmd --permanent --zone=public --add-port=80/tcp && ファイアウォール-cmd --reload
成功
成功

インターフェースをチェックして、nginxが正常にインストールされているかどうかを確認します。

テストが完了したら、nginx設定ファイルを変更し、最後にnginxを再起動します。

[root@youxi1 nginx-1.14.1]# cp /usr/local/nginx/conf/nginx.conf{,.bak}
[root@youxi1 nginx-1.14.1]# vim /usr/local/nginx/conf/nginx.conf
user nginx; // 行 2 location / { // 行 43 以降 root html;
  インデックス index.html index.htm;
  $request_uri ~* \.html$ の場合{
    proxy_pass http://htmlservers;
  }
  $request_uri ~* \.php$ の場合{
    proxy_pass http://phpservers;
  }
  proxy_pass http://picservers;
}
アップストリーム htmlservers { //http モジュールの下に、server モジュールと同じレベルで server 192.168.5.102:80 を追加します。
  サーバー 192.168.5.103:80;
}
アップストリーム phpservers{
  サーバー 192.168.5.102:80;
  サーバー 192.168.5.103:80;
}
アップストリームpicservers {
  サーバー 192.168.5.102:80;
  サーバー 192.168.5.103:80;
}
[root@youxi1 nginx-1.14.1]# /usr/local/nginx/sbin/nginx -s リロード

2) youxi2とyouxi3にウェブページプログラムを展開する

[root@youxi2 ~]# yum -y httpdをインストールします
[root@youxi2 ~]# echo youxi2 > /var/www/html/index.html
[root@youxi2 ~]# echo youxi2.php > /var/www/html/index.php
[root@youxi2 ~]# echo youxi2.other > /var/www/html/index.jsp
[root@youxi2 ~]# systemctl で httpd.service を起動します
 
[root@youxi3 ~]# yum -y httpdをインストールします
[root@youxi3 ~]# echo youxi3 > /var/www/html/index.html
[root@youxi3 ~]# echo youxi3.php > /var/www/html/index.php
[root@youxi3 ~]# echo youxi3.other > /var/www/html/index.jsp
[root@youxi3 ~]# systemctl で httpd.service を起動します

ファイアウォールがオンになっている場合は、ポート番号を忘れずに追加してください。

[root@youxi2 ~]# ファイアウォール-cmd --permanent --zone=public --add-port=80/tcp && ファイアウォール-cmd --reload
成功
成功
 
[root@youxi3 ~]# ファイアウォール-cmd --permanent --zone=public --add-port=80/tcp && ファイアウォール-cmd --reload
成功
成功

3) テスト

まずHTMLページをテストする

次にPHPページをテストします

最後に他のページをテストする

参照: https://www.cnblogs.com/1214804270hacker/p/9325150.html

Nginx を使用した負荷分散クラスターの構築方法についてはこれで終わりです。Nginx 負荷分散クラスターの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Springboot+nginx+https+linux で負荷分散とドメイン名アクセスの簡単なテストを実現
  • Windows で負荷分散に Nginx+Tomcat を使用するための完全な手順
  • Nginx リバース プロキシと負荷分散を実装する方法 (Linux ベース)
  • Nginx の負荷分散構成、ダウンタイム発生時の自動切り替えモード
  • Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します
  • WebApi を使用して複数のサーバーを展開し、Nginx ロード バランシングを構成するチュートリアル
  • 中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)
  • Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例
  • Nginx 7層負荷分散のいくつかのスケジューリングアルゴリズムの簡単な理解
  • Nginx+SpringBoot による負荷分散の実装例

<<:  Vueはログイン認証コードを実装する

>>:  MySQLクエリステートメントの簡単な操作例

推薦する

円形グラデーションプログレスバー効果を実現する CSS サンプルコード

実装のアイデア一番外側は大きな円(グラデーションカラー)グラデーションの円を覆うように、内側に半円を...

mycat を使用して MySQL データベースの読み取りと書き込みの分離を実装する例

MyCATとはエンタープライズアプリケーション開発のための完全にオープンソースの大規模データベースク...

画面なしで無線ネットワークに接続しているときに Raspberry Pi の IP アドレスを見つける方法

あなたがlinuxerだと仮定すると、 windowserだとは想定しません。Windows ユーザ...

WeChatアプレット開発の章:落とし穴の記録

最近、会社初のミニプログラムの開発に参加しました。開発経験は基本的にWebViewをベースとしたハイ...

LinkedIn がウェブサイト閲覧を簡素化するためにリニューアル

ビジネス ソーシャル ネットワーキング サイト LinkedIn は最近、ナビゲーション バーとユー...

uniapp プロジェクトで MQTT を使用する方法

目次1. uniappプラグインマーケットのリファレンスプラグイン2. 具体的な導入プロセス1. m...

Vue Element フロントエンドアプリケーション開発: Vuex での API ストアビューの使用

目次概要1. フロントエンドとバックエンドの分離とWeb APIの優先ルート設計2. Axiosネッ...

TypeScript とは何ですか?

目次1. JavaScriptの問題2. TypeScriptの利点3. TypeScriptの欠点...

Vue2 における 12 種類のコンポーネント通信

目次1. 小道具2..同期3.vモデル4.参照5. $emit/v-on 6. $attrs/$li...

CentOS のデフォルトの SSH ポート番号を変更する方法の例

LinuxサーバーのデフォルトのSSHポート番号は通常22なので、ほとんどのユーザーはセキュリティ上...

React 純粋関数コンポーネント setState がページ更新を更新しない問題の解決方法

目次問題の説明:原因分析:解決:補足: Reactでは、フックが使用されている場合、useState...

Vueのフロントエンドシステムとフロントエンドとバックエンドの分離の詳細な説明

目次概要フロントエンド知識システムフロントエンドの3つの要素プレゼンテーション層 (CSS)動作レイ...

ウェブページ(ウェブサイト)のデザインと制作に関する考えや経験の共有

まずは投稿する前に! 「I Want to Study on My Own!」に改めて感謝します。た...

CSS3 を使用した背景ぼかし効果の 3 つの例

導入から始めず、いきなり本題に入りましょう。通常の背景ぼかし効果は次のとおりです。 プロパティを使用...

MySQL 5.7.20 共通ダウンロード、インストール、設定方法と簡単な操作スキル(解凍版無料インストール)

早朝に MySQL 5.7.19 のインストールを終えたばかりですが、午前中に MySQL が最新バ...