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クエリステートメントの簡単な操作例

推薦する

削除、切り捨て、ドロップの違いと選択方法

序文先週、同僚が私に尋ねました。「兄さん、MySQL にバグを見つけました。午後にディスクをクリーン...

mysql8.0 Windows x64 zip パッケージのインストールと構成のチュートリアル

MySQL 8 Windows版 zipインストール手順(ダウンロードアドレス) 1. ZIPファイ...

ふるい抽選を実施するミニプログラム

この記事の例では、ふるい抽選を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

写真とテキストによる MySQL 8.0.21 インストール チュートリアル

1. ダウンロードリンクをダウンロードするダウンロードをクリックします。Oracle アカウントにロ...

MySQL の general_log ログの知識ポイントの紹介

以下の操作デモンストレーションはすべて MySQL バージョン 5.6.36 に基づいています。仕事...

HTML印刷関連の操作と実装の詳細な説明

原則的にはwindow.print()メソッドを呼び出すことですが、このメソッドは現在のページ全体を...

Linux でパスワードの有効期限を表示および設定する方法

適切な設定を行うことで、Linux ユーザーにパスワードを定期的に変更させることができます。パスワー...

JS における ES6 継承と ES5 継承の違い

目次継承ES5 プロトタイプ継承ES6 クラス継承両者の違いES5プロトタイプ継承の内部実装ES6 ...

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

MySQL 8.0.21のインストールと設定方法を記録してみんなで共有します。 1. ダウンロード1...

JavaScript で右クリック メニューを統合する layim のサンプル コード

目次1. 効果の実証2. 実装チュートリアル3. 最後に、完全なコードを添付します4. その他の右ク...

Centos7でglibcをアップグレードするとシステム異常(起動できない)になる場合の解決方法

目次問題の原因:解決:解決:私は Centos7 を使用しています (理論的にはこの方法は Cent...

VPS はオフライン ダウンロード サーバーを構築します (ネットワーク ディスクの時代以降)

モチベーション学習の必要性から、海外のサーバーメーカー(どこのメーカーかは言いません)のVPSサービ...

MYSQLでプロシージャの名前を変更する方法の詳細な説明

最近、ストアド プロシージャの名前を変更する機能を使用しました。インターネットで情報を検索しましたが...

CentOS7にPostgreSQL11をインストールする方法

CentOS 7にPostgreSQL 11をインストールする PostgreSQL: 世界で最も先...

円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

序文このプロジェクトでは円形のメニューが必要です。オンラインで検索しましたが、適切なものが見つからな...