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 データベースを操作する方法

推薦する

Redhat 7.3 に MySQL 8.0.22 をインストールするための詳細なチュートリアル (バイナリ インストール)

目次1. MySQLインストールパッケージをダウンロードする2. MySQLのアンインストール手順3...

Nginx の場所と proxy_pass パスの設定の問題の概要

目次1. Nginxロケーションの基本設定1.1 Nginx 設定ファイル1.2 Pythonスクリ...

MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴

概要中小規模のプロジェクトでは、特にレポートを作成するときに、結合テーブル クエリが非常に一般的な操...

HTML Webページ作成チュートリアル iframeタグを慎重に使用してください

iframe を使用すると、他の Web サイトのページを簡単に呼び出すことができますが、注意して使...

MySQL 5.7.21 解凍バージョンのインストールと設定のグラフィックチュートリアル

この記事では、MySQL 5.7.21の解凍版をダウンロードしてインストールする詳細な手順を記録して...

ブラウザをJavaScriptで対話させる方法

目次1. 最も単純な例2. 音声の速度とピッチをカスタマイズする3. 音量の調整方法4. よく使われ...

WeChatミニプログラム公式顔認証の詳しい説明

ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...

Navicat for SQLite で中国語データを CSV にインポートする方法

この記事では、参考までに、csv中国語データをNavicat for SQLiteにインポートする具...

MySQL インデックスが失敗するいくつかの状況の概要

1. インデックスはnull値を保存しないより正確に言うと、単一列インデックスには null 値は格...

Vueバインディングクラスとバインディングインラインスタイルの実装方法

目次バインディングクラスインラインスタイルのバインディングバインディングクラス方法1:オブジェクト構...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

VirtualBox での CentOS 8.1 仮想マシンのインストールを最小限に抑える詳細なチュートリアル

1. 関連ツールと画像をダウンロードするダウンロードリンクバーチャルボックス: https://do...

ネイティブJSが様々なスポーツの均一な動きを実現

この記事では、ネイティブ JS で実装された均一なモーションを紹介します。その効果は次のとおりです。...

サーバーの購入と初期構築方法

しばらくサーバーいじってなかったけど、やることがなくなったのでモバイルワークスに行って海外サーバーを...

MySQL の暗号化と復号化の例

MySQL の暗号化と復号化の例データの暗号化と復号化はセキュリティ分野で非常に重要です。プログラマ...