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

推薦する

CSSはリモコンのボタンを模倣する

注: このデモはミニプログラム環境でテストされており、他の h5 および pc Web ページにも適...

Vueは単純なランダムロールコールを実行します

目次レイアウト部分: <div id="アプリ"> <p>...

Reactイベントメカニズムソースコード分析

目次原理ソースコード分析委任されたイベントバインディングすべてのサポートされているイベントを聴くネイ...

CSS で画像アダプティブ コンテナを実装するいくつかの方法 (要約)

多くの場合、画像をコンテナのサイズに合わせて調整する必要があります。 1. imgタグ方式幅と高さを...

フォームの読み取り専用属性と無効な属性についての簡単な説明

フォーム内の読み取り専用および無効な属性1. 読み取り専用:サーバーは、ユーザーがデータを変更するこ...

css-loader を使用して vue-cli で css モジュールを実装する

【序文】 Vue と React の CSS モジュール ソリューションはどちらも、実装にローダーに...

Web デザインにおける HTML フォーマットと長いファイルに関するヒント

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案、W...

Ubuntu で時刻同期に NTP を使用する

NTP は、ネットワーク上で時間を同期するための TCP/IP プロトコルです。通常、クライアントは...

1 つの記事で Vuex を理解する

目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...

MySQL 学習ノート ヘルプ ドキュメント

システムヘルプを表示help contents mysql> ヘルプコンテンツ; ヘルプ カテ...

VUE でタブページを切り替える 4 つの方法

目次1. 静的実装方法: 2. 第2のシミュレーション動的方法3. 3番目の動的データ方式4. 動的...

CSS3 でテキスト ストロークを実装する 2 つの方法 (要約)

質問最近、以下に示すように、テキストストローク効果を実現するという要件に遭遇しました。 解決策1まず...

CSSは複数の要素をボックスの両端に揃える効果を実現します

要素の両端を揃える配置レイアウトは、実際の開発のいたるところで見られます。これは、フレックスレイアウ...

海外でダウンロードできる25個の新鮮で便利なアイコンセット

1. Eコマースアイコン2. アイコンスイーツ2 3. 携帯電話アイコンパック4. 旗アイコンセット...

Ubuntu インストール時にブラックスクリーンが表示される場合の解決策 (3 種類)

私のコンピューターのグラフィック カードは Nvidia グラフィック カードです。再起動後、画面に...