Nginx は高可用性クラスタ構築を実装します (Keepalived+Haproxy+Nginx)

Nginx は高可用性クラスタ構築を実装します (Keepalived+Haproxy+Nginx)

1. コンポーネントと実装機能

Keepalived: Haproxy サービスの高可用性を実現し、デュアルアクティブ モデル構成を採用します。

Haproxy: Nginx の負荷分散と読み取り/書き込み分離を実装します。

Nginx: HTTP リクエストの高速処理を実現します。

2. アーキテクチャ設計図

3. Keepalived のデプロイメント

Keepalived は両方のノードにインストールする必要があります。コマンドは次のとおりです。

$ yum -y キープアライブドをインストール

172.16.25.109ノードのkeepalived.confファイルの設定を変更します。コマンドは次のとおりです。

$ vim /etc/keepalived/keepalived.conf

変更された内容は次のとおりです。

! keepalived の設定ファイル
グローバル定義 {
   通知メール{
         ルート@ローカルホスト
   }
   通知メール送信元 [email protected]
   SMTP_接続タイムアウト 3
   SMTPサーバー 127.0.0.1
   ルータID LVS_DEVEL
}
vrrp_script chk_maintaince_down {
   スクリプト "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   間隔1
   重量2
}
vrrp_script chk_haproxy {
    スクリプト「killall -0 haproxy」
    間隔1
    重量2
}
vrrp_インスタンス VI_1 {
    インターフェース eth0
    状態マスター
    優先度100
    仮想ルータID 125
    garp_master_delay 1
    認証
        認証タイプ PASS
        認証パスワード 1e3459f77aba4ded
    }
    トラックインターフェース{
       eth0
    }
    仮想IPアドレス{
        172.16.25.10/16 dev eth0 ラベル eth0:0
    }
    トラックスクリプト {
        chk_haproxy
    }
    通知マスター「/etc/keepalived/notify.sh マスター 172.16.25.10」
    通知バックアップ「/etc/keepalived/notify.sh 172.16.25.10 をバックアップ」
    通知障害「/etc/keepalived/notify.sh 障害 172.16.25.10」
}
vrrp_インスタンス VI_2 {
    インターフェース eth0
    状態 バックアップ
    優先度99
    仮想ルータID 126
    garp_master_delay 1
    認証
        認証タイプ PASS
        認証パスワード 7615c4b7f518cede
    }
    トラックインターフェース{
       eth0
    }
    仮想IPアドレス{
        172.16.25.11/16 dev eth0 ラベル eth0:1
    }
    トラックスクリプト {
        chk_haproxy
メンテナンスダウン
    }
    通知マスター「/etc/keepalived/notify.sh マスター 172.16.25.11」
    通知バックアップ「/etc/keepalived/notify.sh 172.16.25.11 をバックアップ」
    通知障害「/etc/keepalived/notify.sh 障害 172.16.25.11」
}

同様に、172.16.25.110 ノードの keepalived.conf 構成を次の内容に変更します。

! keepalived の設定ファイル
グローバル定義 {
   通知メール{
         ルート@ローカルホスト
   }
   通知メール送信元 [email protected]
   SMTP_接続タイムアウト 3
   SMTPサーバー 127.0.0.1
   ルータID LVS_DEVEL
}
vrrp_script chk_maintaince_down {
   スクリプト "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   間隔1
   重量2
}
vrrp_script chk_haproxy {
    スクリプト「killall -0 haproxy」
    間隔1
    重量2
}
vrrp_インスタンス VI_1 {
    インターフェース eth0
    状態 バックアップ
    優先度99
    仮想ルータID 125
    garp_master_delay 1
    認証
        認証タイプ PASS
        認証パスワード 1e3459f77aba4ded
    }
    トラックインターフェース{
       eth0
    }
    仮想IPアドレス{
        172.16.25.10/16 dev eth0 ラベル eth0:0
    }
    トラックスクリプト {
        chk_haproxy
メンテナンスダウン
    }
    通知マスター「/etc/keepalived/notify.sh マスター 172.16.25.10」
    通知バックアップ「/etc/keepalived/notify.sh 172.16.25.10 をバックアップ」
    通知障害「/etc/keepalived/notify.sh 障害 172.16.25.10」
}
vrrp_インスタンス VI_2 {
    インターフェース eth0
    状態マスター
    優先度100
    仮想ルータID 126
    garp_master_delay 1
    認証
        認証タイプ PASS
        認証パスワード 7615c4b7f518cede
    }
    トラックインターフェース{
       eth0
    }
    仮想IPアドレス{
        172.16.25.11/16 dev eth0 ラベル eth0:1
    }
    トラックスクリプト {
        chk_haproxy
    }
    通知マスター「/etc/keepalived/notify.sh マスター 172.16.25.11」
    通知バックアップ「/etc/keepalived/notify.sh 172.16.25.11 をバックアップ」
    通知障害「/etc/keepalived/notify.sh 障害 172.16.25.11」
}
# vi /etc/keepalived/notify.sh
#!/bin/bash
# 著者: Jason.Yu <[email protected]>
# 説明: 通知スクリプトの例
#
連絡先='root@localhost'
通知() {
    mailsubject="`hostname` は $1:$2 浮動小数点数になります"
    mailbody="`date '+%F %H:%M:%S'`: vrrp 遷移、`hostname` が $1 に変更されました"
    echo $mailbody | mail -s "$mailsubject" $contact
}
ケース「$1」
    マスター)
        マスターに通知 $2
        /etc/rc.d/init.d/haproxy を再起動します
        終了 0
    ;;
    バックアップ)
        通知バックアップ $2 # ノードがバックアップ状態に切り替わるときに、chk_maintaince と chk_haproxy が haproxy サービスを複数回操作するのを防ぐために、haproxy サービスを意図的に停止する必要はありません。
        終了 0
    ;;
    故障)
        障害を通知 $2 # 上記と同じ exit 0
    ;;
    *)
        echo '使用法: `basename $0` {master|backup|fault}'
        出口1
    ;;
エサック

両方のノードで keepalived 起動コマンドを実行します。コマンドは次のとおりです。

  $ サービスキープアライブ開始

4. Haproxyの展開

HAProxy は両方のノードにインストールする必要があります。コマンドは次のとおりです。

 $ yum -y haproxyをインストール

172.16.25.109 ノードと 172.16.25.110 ノードの haproxy.cfg ファイル構成を変更します (2 つのノードの構成ファイルは一致しています)。コマンドは次のとおりです。

 $ vim /etc/haproxy/haproxy.cfg

設定ファイルの内容は次のとおりです。

グローバル
    ログ 127.0.0.1 ローカル2
    chroot /var/lib/haproxy
    pidファイル /var/run/haproxy.pid
    マックスコン 4000
    ユーザー haproxy
    グループ ハプロキシ
    daemon # バックグラウンド プログラムとして実行します。
デフォルト
    mode http # レイヤー 7 フィルタリングを実行するには HTTP モードを選択します。
    ロググローバル
    オプション httplog # より豊富なログ出力を取得できます。
    オプション dontlognull
    オプション http-server-close # サーバーは HTTP 接続機能を閉じることができます。
    option forwardfor except 127.0.0.0/8 # クライアントの IP アドレスをサーバーに渡し、それを「X-Forward_for」ヘッダーに書き込みます。
    オプション再ディスパッチ
    再試行 3
    タイムアウト http-request 10 秒
    タイムアウトキュー 1分
    タイムアウト接続10秒
    タイムアウトクライアント 1分
    タイムアウトサーバー 1分
    タイムアウト http-keep-alive 10 秒
    タイムアウトチェック 10秒
    マックスコン 30000
統計を聞く
    モード http
    bind 0.0.0.0:1080 # 統計ページはポート 1080 にバインドされます。
    stats enable # 統計ページ機能を有効にします。
    stats hide-version #Haproxy のバージョン番号を非表示にします。
    stats uri /haproxyadmin?stats #統計ページのアクセス uri をカスタマイズします。
    統計レルム Haproxy\ 統計 #統計ページでのパスワード検証のためのプロンプト情報。
    stats auth admin:admin # 統計ページのログイン認証を有効にします。
    stats admin if TRUE # ログインしたユーザーが検証に合格すると、管理機能が付与されます。
フロントエンド http-in
    バインド *:80
    モード http
    ロググローバル
    オプション httpclose
    オプションログアサップ
    オプション dontlognull
    キャプチャリクエストヘッダーホスト長さ20
    キャプチャリクエストヘッダーReferer長さ60
    acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static path_end -i .jpg .jpeg .gif .png .css .js .html
    use_backend static_servers if url_static # ACL ルールを満たすリクエストはバックエンドの静的サーバーに転送されます default_backend dynamic_servers # リクエストはデフォルトでバックエンドの動的サーバーに転送されます backend static_servers
    バランスラウンドロビン
    server imgsrv1 192.168.0.25:80 check maxconn 6000 # 静的サーバー。複数のサーバーを設定でき、重みを設定できます。
バックエンド dynamic_servers
    balance source # 動的リクエストの場合、ソース スケジューリング アルゴリズムを使用して、ある程度のセッション永続性を実現できますが、セッション永続性を実現するには Cookie バインディングを使用するのが最適です。server websrv1 192.168.0.35:80 check maxconn 1000 # 動的サーバーは複数のサーバーで構成でき、重みを設定できます。

2 つのノードは次のコマンドでサービスを開始します。

$ サービス haproxy 開始

5. Nginxのデプロイメント

yum -y groupinstall "開発ツール"
yum -y groupinstall “サーバープラットフォーム開発”
yum インストール gcc openssl-devel pcre-devel zlib-devel
グループ追加 -r nginx
ユーザー追加 -r -g nginx -s /sbin/nologin -M nginx
tar xf nginx-1.4.7.ta​​r.gz
nginx-1.4.7をインストールします
mkdir -pv /var/tmp/nginx
./configure \
  --prefix=/usr \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --http_ssl_module \ で始まる
  --http_flv_module \ で始まる
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --pcre 付き
作成 && インストール

サービススクリプトを構成する

vi /etc/init.d/nginx # サービススクリプトの設定#!/bin/sh
#
# nginx - このスクリプトはnginxデーモンを起動および停止します
#
# chkconfig: -85 15
# 説明: Nginx は HTTP(S) サーバーであり、HTTP(S) リバースです \
# プロキシと IMAP/POP3 プロキシ サーバー
# プロセス名: nginx
# 設定: /etc/nginx/nginx.conf
# 設定: /etc/sysconfig/nginx
# pidファイル: /var/run/nginx.pid
# ソース関数ライブラリ。
. /etc/rc.d/init.d/functions
# ソースネットワーク構成。
. /etc/sysconfig/ネットワーク
# ネットワークが稼働していることを確認します。
[ "$NETWORKING" = "no" ] && 終了 0
nginx="/usr/sbin/nginx"
prog=$(ベース名 $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
ロックファイル=/var/lock/subsys/nginx
ディレクトリを作る() {
   # 必要なディレクトリを作成する
   user=`nginx -V 2>&1 | grep "configure 引数:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&1 | grep 'configure 引数:'`
   オプトイン$options; を行う
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           値=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "作成中" $value
               mkdir -p $value && chown -R $user $value
           フィ
       フィ
   終わり
}
始める() {
    [ -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 || $を返しますか?
    停止
    睡眠1
    始める
}
リロード() {
    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
エサック
chmod +x /etc/init.d/nginx # サービス スクリプトの実行権限を復元します vi /etc/nginx/nginx.conf # メイン構成ファイルを編集します worker_processes 2;
エラーログ /var/log/nginx/nginx.error.log;
pid /var/run/nginx.pid;
イベント {
    ワーカー接続 1024;
}
http {
    mime.types を含めます。
    デフォルトタイプ アプリケーション/オクテットストリーム;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    ファイル送信オン;
    キープアライブタイムアウト65;
    サーバー{
        聞く 80;
        サーバー名 xxrenzhe.lnmmp.com;
        access_log /var/log/nginx/nginx.access.log メイン;
        位置 / {
            ルート /www/lnmmp.com;
            インデックス index.php index.html index.htm;
        }
        エラーページ 404 /404.html;
        エラーページ 500 502 503 504 /50x.html;
        場所 = /50x.html {
            ルート /www/lnmmp.com;
        }
        場所 ~ \.php$ {
            ルート /www/lnmmp.com;
            127.0.0.1:9000; をデフォルトとして設定します。
            fastcgi_index インデックス.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_params を含めます。
        }
    }
}
vi /etc/nginx/fastcgi_params # fastcgi パラメータ ファイルを編集します fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $クエリ文字列;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param リクエストURI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

サービスを開始する

service nginx configtest #サービスを開始する前に設定ファイルが正しいことを確認してください service nginx start
ps -ef |grep nginx # nginxプロセス、特にワーカープロセスがworker_processes値と一致しているかどうかを確認します ss -antupl |grep 80 # サービスポートが開始されているかどうかを確認します

6. アクセス検証

Haproxy 統計ページ テスト

動的および静的分離テスト

高可用性テスト

これで、Nginx 高可用性クラスター構築 (Keepalived+Haproxy+Nginx) の紹介は終了です。

Nginx 高可用性クラスタ構築 (Keepalived+Haproxy+Nginx) に関する記事はこれで終了です。Nginx 高可用性クラスタに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker+keepalived+nginx を使用してマスタースレーブホットスタンバイを実装する方法の例
  • Nginx+Keepalived でデュアルマシンのホットスタンバイを実現
  • keepalived デュアルマシンホットスタンバイ nginx の設定方法
  • Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します
  • Nginx+Keepalived でデュアルマシン マスターとバックアップを実装する方法
  • nginx+keepalived 高可用性マスタースレーブ構成の詳細な説明
  • Keepalived を使用して Nginx の自動再起動とデュアルアクティブ ホットスタンバイの高可用性を実現する方法について

<<:  デザインストーリー: ナンバープレートを覚えられない警備員

>>:  MySQL例外に対する一般的な解決策をいくつか分析する

推薦する

MySQL 5.7 でパスワードを忘れた場合の解決方法の詳細な説明

環境: [root@centos7 ~]# uname -r 3.10.0-514.el7.x86_...

MySQL の時間設定に関する考慮事項の詳細な要約

時間は本当に存在するのでしょうか?時間は人間が考え出した概念に過ぎず、物事の変化を測る基準に過ぎない...

Vue elementUI はツリー構造テーブルと遅延読み込みを実装します

目次1. 成果を達成する2. バックエンドの実装2.1 エンティティクラス2.2 データベース内のデ...

MySQLのROUND関数の丸め演算における落とし穴の分析

この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご...

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。 ...

MySQLにおけるACIDトランザクションの実装原理の詳細な説明

導入いつものように、シーンから始めましょう〜インタビュアー:「トランザクションの4つの特性をご存知で...

Angularの親子コンポーネント通信の詳細な説明

目次使用されるAPI簡単な例人.ts親コンポーネントサブコンポーネント効果要約する使用されるAPI ...

ウェブデザイナーが持つべき資質と能力

Web デザインは、インターネットの出現後に誕生した新興の周辺産業です。 Web ページは店頭のよう...

docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...

Nodeはリクエスト追跡にasync_hooksモジュールを使用します

async_hooks モジュールは、Node.js バージョン 8.0.0 に正式に追加された実験...

ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス

1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

MySQL スロークエリログの設定と使用方法のチュートリアル

序文MySQL スロー クエリ ログは、日常業務でよく遭遇する機能です。MySQL スロー クエリ ...

Navicateを使用してAlibaba Cloud Server上のMySQLに接続する

1. まず、サーバーの mysql にアクセスして権限を変更します。 GRANT オプション付きで、...