VMware で Nginx+KeepAlived クラスタ デュアルアクティブ アーキテクチャを展開する際の問題と解決策

VMware で Nginx+KeepAlived クラスタ デュアルアクティブ アーキテクチャを展開する際の問題と解決策

序文

負荷分散には nginx を使用します。アーキテクチャのフロントエンドまたは中間層として、トラフィックが増加すると、負荷分散のための高可用性アーキテクチャを構築する必要があります。keepalived を使用して、単一ポイントのリスクを解決します。nginx がダウンすると、すぐにバックアップ サーバーに切り替えることができます。

VMware ネットワーク構成で発生する可能性のある問題の解決策

  • VMware DHCP ServiceVMware NAT Serviceサービスを起動します
  • ネットワーク アダプタでネットワーク共有を有効にし、他のネットワークのアクセス許可を確認して保存し、仮想マシンを再起動します。

インストール

ノードの展開

ノード住所仕える
セントオス7_1 192.168.211.130キープアライブ+Nginx
セントオス7_2 192.168.211.131キープアライブ+Nginx
セントオス7_3 192.168.211.132 Redis サーバー
web1 (物理マシン) 192.168.211.128高速API+セロリ
web2 (物理マシン) 192.168.211.129高速API+セロリ

ウェブ構成

web1はPython httpサーバーを起動します

vim インデックス.html

<html>
<本文>
<h1>Web サーバー 1</h1>
</本文>
</html>

nohup python -m SimpleHTTPServer 8080 > running.log 2>&1 &

web2はPython httpサーバーを起動します

vim インデックス.html

<html>
<本文>
<h1>Web サーバー 2</h1>
</本文>
</html>

nohup python -m SimpleHTTPServer 8080 > running.log 2>&1 &

ファイアウォールをオフにする

ファイアウォール-cmd --state
systemctl 停止 ファイアウォールd.service
systemctl は、firewalld.service を無効にします。

ブラウザのアクセスは正常になり、ページにはWeb Svr 1と2が表示されます。

Centos1と2にNginxをインストールする

まず、Alibaba Cloudソースを設定します

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

依存パッケージをインストールする

yum -y gccをインストールします
yum インストール -y pcre pcre-devel
yum インストール -y zlib zlib-devel
yum インストール -y openssl openssl-devel

nginxをダウンロードして解凍します

http://nginx.org/download/nginx-1.8.0.tar.gz をダウンロードしてください
tar -zxvf nginx-1.8.0.tar.gz

nginxをインストールする

nginx-1.8.0をインストールします
./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_ssl_module
作る
インストールする
/usr/local/nginx/sbin/ をコピーします。
# 設定ファイルを確認する ./nginx -t
# nginxを起動する
./nginx

nginxアクセスを開く

ファイアウォールコマンド --zone=public --add-port=80/tcp --permanent
systemctl で、firewalld.service を再起動します。

このとき、130 と 131 にアクセスすると nginx のホームページが表示されます。

nginx 起動ファイルを作成する

init.d フォルダーに nginx 起動ファイルを作成する必要があります。 この方法では、サーバーが init プロセスを再起動するたびに、Nginx が自動的に起動されます。

/etc/init.d/ をコピーします
vim nginx

#!/bin/sh
#
# nginx - このスクリプトはnginxデーモンを起動および停止します
#
# chkconfig: -85 15
# 説明: Nginx は HTTP(S) サーバーであり、HTTP(S) リバースです \
# プロキシと IMAP/POP3 プロキシ サーバー
# プロセス名: nginx
# 設定: /etc/nginx/nginx.conf
# pidファイル: /var/run/nginx.pid
# ユーザー: nginx

# ソース関数ライブラリ。
. /etc/rc.d/init.d/functions

# ソースネットワーク構成。
. /etc/sysconfig/ネットワーク

# ネットワークが稼働していることを確認します。
[ "$NETWORKING" = "no" ] && 終了 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(ベース名 $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

ロックファイル=/var/run/nginx.lock

始める() {
    [ -x $nginx ] || 終了 5
    [ -f $NGINX_CONF_FILE ] || 終了 6
    echo -n $"$prog を開始しています: "
    デーモン $nginx -c $NGINX_CONF_FILE
    戻り値=$?
    エコー
    [ $retval -eq 0 ] && $lockfile をタッチ
    $retvalを返す
}

停止() {
    echo -n $"$prog を停止しています: "
    プロセスを終了する $prog -QUIT
    戻り値=$?
    エコー
    [ $retval -eq 0 ] && rm -f $lockfile
    $retvalを返す
}

再起動() {
    configtest || $を返しますか?
    停止
    始める
}

リロード() {
    configtest || $を返しますか?
    echo -n $"$prog を再ロードしています: "
    nginx を killproc する -HUP
    RETVAL=$?
    エコー
}

強制リロード() {
    再起動
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    ステータス $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

ケース「$1」
    始める)
        rh_status_q && 終了 0
        1ドル
        ;;
    停止)
        rh_status_q || 終了 0
        1ドル
        ;;
    再起動|構成テスト)
        1ドル
        ;;
    リロード
        rh_status_q || 終了 7
        1ドル
        ;;
    強制リロード
        強制リロード
        ;;
    状態)
        rh_ステータス
        ;;
    condrestart|再起動を試みる)
        rh_status_q || 終了 0
            ;;
    *)
        echo $"使用法: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        出口2
エサック

設定ファイルを確認し、次のコマンドを順番に入力します。

chkconfig --add nginx
chkconfig --level 345 nginx オン

このファイルに実行権限を追加する

chmod +x nginx 
ls

機能 netconsole ネットワーク nginx README

Nginxサービスを開始する

サービス nginx 開始
サービス nginx ステータス
サービス nginx 再読み込み

Nginx リバース プロキシ、負荷分散 (centos_1)

nginx.conf設定ファイルを変更し、コメントされたコードを削除します。

/usr/local/nginx/conf/ をコピーします。
nginx.conf をコピーして、 nginx.conf.bak を開きます。
egrep -v '^#' nginx.conf.bak
egrep -v '^#|^[ ]*#' nginx.conf.bak
egrep -v '^#|^[ ]*#|^$' nginx.conf.bak 
egrep -v '^#|^[ ]*#|^$' nginx.conf.bak >> nginx.conf
nginx.conf を cat する

出力は次のようになります

ワーカープロセス 1;
イベント {
    ワーカー接続 1024;
}
http {
    mime.types を含めます。
    デフォルトタイプ アプリケーション/オクテットストリーム;
    ファイル送信オン;
    キープアライブタイムアウト65;
    サーバー{
        聞く 80;
        server_name ローカルホスト;
        位置 / {
            ルートhtml;
            インデックス index.html index.htm;
        }
        エラーページ 500 502 503 504 /50x.html;
        場所 = /50x.html {
            ルートhtml;
        }
    }
}

nginx設定を再読み込み

# 設定ファイルが正常かどうかをテストします。../sbin/nginx -t
# nginx 設定を再読み込みします。../sbin/nginx -s reload

nginxリバースプロキシと負荷分散を構成する

ワーカープロセス 1;
イベント {
    ワーカー接続 1024;
}
http {
    mime.types を含めます。
    デフォルトタイプ アプリケーション/オクテットストリーム;
    ファイル送信オン;
    キープアライブタイムアウト65;
    
    # websvr サーバー クラスター (負荷分散プールとも呼ばれます)	
    アップストリーム websvr {
        サーバー 192.168.211.128:8001 重み=1;
        サーバー 192.168.211.129:8001 重み=2;
    }
	
    サーバー{
        聞く 80;
        # IP アドレスまたはドメイン名を指定するために使用されます。複数の設定はスペースで区切られます。server_name 192.168.211.130;
        位置 / {
            # すべてのリクエストを websvr クラスターに送信して処理します。proxy_pass http://websvr;
        }
        エラーページ 500 502 503 504 /50x.html;
        場所 = /50x.html {
            ルートhtml;
        }
    }
}

nginxを再起動します

sbin/nginx -s リロード

websvr 名は、これらのサーバーの意味を示すようにカスタマイズできます。つまり、負荷分散を実現するには、 upstream websvrproxy_passを追加するだけで済みます。

これで、130 にアクセスすると、Web サーバー 1 と Web サーバー 2 がページ上で切り替わります。サーバーは重みに基づいて選択されます。重みの値が大きいほど、重みが高くなります。つまり、ページを繰り返し更新すると、Web サーバー 2 は平均 2 回表示され、Web サーバー 1 は 1 回表示されます。

今のところ、高可用性は実現できていません。この方法では Web サービスを実行でき、単一障害点も処理できますが、nginx サービスに障害が発生すると、基本的にシステム全体にアクセスできなくなるため、これを確保するには複数の Nginx サーバーが必要になります。

複数の Nginx が連携して動作する、Nginx の高可用性 [デュアル マシン マスター スレーブ モード]

131サーバー(centos_2)に新しいnginxサービスを追加します。前の設定と同様に、nginx.confを変更するだけです。

ワーカープロセス 1;
イベント {
    ワーカー接続 1024;
}
http {
    mime.types を含めます。
    デフォルトタイプ アプリケーション/オクテットストリーム;
    ファイル送信オン;
    キープアライブタイムアウト65;

        アップストリーム websvr {
        サーバー 192.168.211.128:8001 重み=1;
        サーバー 192.168.211.129:8001 重み=2;
    }

    サーバー{
        聞く 80;
        サーバー名 192.168.211.131;
        位置 / {
            proxy_pass http://websvr;
        }
        エラーページ 500 502 503 504 /50x.html;
        場所 = /50x.html {
            ルートhtml;
        }
    }
}

# nginxをリロード
sbin/nginx -s リロード

これで、http://192.168.211.130/ にアクセスしても、http://192.168.211.131/ と同様の結果が得られます。

これら 2 つの Nginx サーバーの IP は異なるので、これら 2 つの nginx サーバーを連携させるにはどうすればよいでしょうか?これには keepalived の使用が必要です。

ソフトウェアをインストールし、2つのCentOSを同時にインストールする

yum インストール keepalived pcre-devel -y

keepalived を設定する

両方にバックアップ

cp /etc/keepalived/keepalived.conf keepalived.conf.bak

centos_1 Keepalived-MASTER

[root@localhost keepalived]# cat keepalived.conf
! keepalived の設定ファイル

グローバル定義 {
    script_user ルート
	スクリプトセキュリティを有効にする
}

vrrp_script chk_nginx {
    # nginx サービスが正常に実行されているかどうかを検出するための監視スクリプトを指定します。スクリプト "/etc/keepalived/chk_nginx.sh"
    #監視時間を指定して、10秒ごとに間隔10を実行します
    # 優先度はスクリプトの結果によって変わります。検出に失敗した場合 (スクリプトがゼロ以外の値を返す場合)、優先度は -5 になります。
    # 重量 -5
    # # 検出は、2 回連続して失敗した場合にのみ、真の失敗とみなされます。優先度は重みによって減少します(1~255の間)
    # 秋 2
    # 検出が一度成功すると、成功したとみなされます。ただし、優先度は変わりません。# 1 上昇
}

vrrp_インスタンス VI_1 {
	#keepalivedロールを指定し、ホストをMASTERに、スタンバイをBACKUPに設定します
    状態 バックアップ
	# HA 監視ネットワークのインターフェースを指定します。 CentOS7はip addrを使用してインターフェースens33を取得します
	# プライマリルータとバックアップルータの virtual_router_id は同じである必要があります。2 番目の IP アドレス グループに設定できます: 1 から 255 までの範囲でなければなりません
    仮想ルータID 51
	# 優先度の値。同じ vrrp_instance では、MASTRE は BAUCKUP より高くなければなりません。MASTER が回復すると、BACKUP が自動的に優先度 90 を引き継ぎます。
	# VRRPブロードキャストサイクル(秒単位)。ブロードキャストが検出されない場合、サービスはダウンしていると見なされ、プライマリとバックアップadvert_int 1
	# 認証タイプとパスワードを設定します。マスターとスレーブは同じ認証を持っている必要があります {
		# vrrp 認証タイプを設定します。主なタイプは PASS と AH の 2 つです。auth_type PASS
		# 通常の通信では、暗号化されたパスワードは両方のサーバーで同じである必要があります auth_pass 1111
    }
	トラックスクリプト {
        # vrrp_script セクションで指定された名前の VRRP スクリプトを参照して、監視対象サービスを実行します。定期的に実行して優先度を変更する chk_nginx
    }
    仮想IPアドレス{
		# VRRP HA仮想アドレスVIPが複数ある場合は、192.168.211.140を続けて入力します。
    }
}

構成ファイルをノード131に送信する

scp /etc/keepalived/keppalived.conf 192.168.211.131:/etc/keepalived/keepalived.conf

ノード131変更する必要があるのは

状態 バックアップ
優先度90

メインの keepalived 構成監視スクリプト chk_nginx.sh

keepalivedで実行するスクリプトを作成する

vi /etc/keepalived/chk_nginx.sh

#!/bin/bash
# 変数counterに値を割り当てるnginxプロセスがあるかどうかを確認します
カウンター=`ps -C nginx --no-header |wc -l`
# プロセスがない場合、値は0になります
[ $counter -eq 0 ]の場合;
    # nginxを起動してみる
    echo "Keepalived 情報: nginx を起動してみてください" >> /var/log/messages
    nginx のディレクトリ
    睡眠3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        # システムメッセージを出力します echo "Keepalived Info: Unable to start nginx" >> /var/log/messages
        # まだ開始されていない場合は、keepalived プロセスを終了します # killall keepalived
        # または /etc/init.d/keepalived stop を停止します
        出口1
    それ以外
        echo "Keepalived 情報: Nginx サービスが復元されました" >> /var/log/messages
        終了 0
    フィ
それ以外
    # ステータスは正常です echo "Keepalived 情報: Nginx 検出は正常です" >> /var/log/messages;
    終了 0
フィ

次に実行権限を付与してテストします

chmod +x chk_nginx.sh
./chk_nginx.sh

両側でkeepalivedを再起動する

systemctl を再起動する keepalived
systemctl ステータス キープアライブ

このとき、 .140のアクセスも正常に表示され、バインドされた IP が成功したことを意味します。実行前に、次のコマンドを使用して、出力ログ メッセージをリアルタイムで表示できます。

tail -f /var/log/メッセージ 

# nginxがKeepalived情報をオフにした場合: nginxを起動してみてください
Keepalived 情報: Nginx サービスが復旧しました
# nginx は Keepalived を正常に開きます 情報: Nginx の検出は正常です

nginx は正常に検出した場合は 0 を返し、検出しなかった場合は 1 を返します。ただし、keepalived は転送を実現するためにこの戻り値を検出するのではなく、keepalived サービスが存在するかどうかを検出してローカル VIP を解放し、最終的に仮想 IP を別のサーバーに転送するようです。

参考文献

https://www.jianshu.com/p/7e8e61d34960
https://www.cnblogs.com/zhangxingeng/p/10721083.html

Nginx+KeepAlived クラスタ デュアルアクティブ アーキテクチャの VMware 展開に関するこの記事はこれで終わりです。Nginx+KeepAlived クラスタに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx は高可用性クラスタ構築を実装します (Keepalived+Haproxy+Nginx)
  • 高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

<<:  ウェブデザインにおけるカラーマッチングの優れた例30選

>>:  ORM モデル フレームワークを使用して MySQL データベースを操作する方法

推薦する

Linuxの一般的なコマンドでLinuxのmoreコマンドを使用する方法

more は、最もよく使用されるツールの 1 つです。最も一般的な使用方法は、出力コンテンツを表示し...

Docker stopはすべてのコンテナを停止/削除します

この記事では主に、すべてのコンテナを削除する Docker stop/remove を紹介し、皆さん...

MySQLサブクエリの詳細な例

サブクエリの分類返された結果セットによる分類サブクエリは、返される結果セットの違いに応じて、テーブル...

Nginx+Tomcat 負荷分散クラスタの実装例

目次導入1. 事例の概要2. 環境の展開3. Nginxホストのインストール4. Tomcatのイン...

Cronジョブを使用してCpanelでPHPを定期的に実行する方法

cpanel 管理バックエンドを開き、「詳細」オプションの下に「Clock Guardian Job...

Vue でのルータービューコンポーネントの使用に関する詳細な説明

Vue プロジェクトを開発する場合、さまざまなコンポーネント ページを表示するために切り替えることが...

知らないかもしれないLinuxのファイル権限管理方法

なぜ権限管理が必要なのでしょうか? 1. コンピュータ リソースは限られているため、コンピュータ リ...

MySQLカスタム関数の簡単な使用例

この記事では、例を使用して MySQL カスタム関数の使用方法を説明します。ご参考までに、詳細は以下...

MySQL パーティションテーブルの正しい使用方法

MySQL パーティションテーブルの概要数億、あるいは数十億ものレコードを格納するテーブルに遭遇する...

HTML Webページの例を使用してヘッドエリアコードの意味を説明する

例を使って、Webページのヘッダー情報の意味を理解しましょう。 <!DOCTYPE HTML ...

Vue プロジェクトで TS (TypeScript) を使用するための入門チュートリアル

目次1. Typescriptの紹介2. 設定ファイル webpack 設定3. プロジェクトに.t...

Ubuntu 上の Apache で SSL (https 証明書) を設定する正しい方法の詳細な説明

まず、Alibaba Cloud の公式チュートリアルをご覧ください。ファイルの説明: 1. 証明書...

html2canvas で破線境界線を実装する例

html2canvas は、HTML 要素からキャンバスを生成するライブラリです。描画されるキャンバ...

MySQL データベースの手動およびスケジュールされたバックアップ手順

目次手動バックアップタイマーバックアップ手動バックアップ1) cmd コンソール: mysqldum...