nginx と Keepalived を用いた高可用性構成

本記事では、nginx と Keepalived を組み合わせて高可用性(HA)クラスタを構築する手順を説明します。2台のサーバー(192.168.153.14 を主、192.168.153.15 を副)を使用し、仮想IPアドレス(VIP: 192.168.153.100)を動的に切り替える仕組みを実現します。

1. nginx のインストール

両サーバーに nginx をソースからインストールします。

yum -y install gcc pcre-devel zlib-devel openssl-devel

wget https://nginx.org/download/nginx-1.9.9.tar.gz
tar -xzvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

systemd サービスファイルを作成し、自動起動を設定します。

# /etc/systemd/system/nginx.service
[Unit]
Description=nginx web server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

サービスを有効化して起動します。

systemctl daemon-reload
systemctl enable nginx
systemctl start nginx

同様の手順で、もう一方のサーバーにも nginx をインストールします。必要に応じてパッケージをコピーして再ビルド可能です。

2. Keepalived の設定

両ノードに Keepalived をインストールします。

yum -y install keepalived

ヘルスチェックスクリプトの作成

nginx の稼働状態を監視するシェルスクリプトを作成します。

# /etc/keepalived/check_nginx.sh
#!/bin/bash
COUNT=$(ps -C nginx --no-header | wc -l)
if [ $COUNT -eq 0 ]; then
    systemctl start nginx
    sleep 2
    if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        systemctl stop keepalived
    fi
fi

実行権限を付与します。

chmod +x /etc/keepalived/check_nginx.sh

主ノードの Keepalived 設定

# /etc/keepalived/keepalived.conf (主: 192.168.153.14)
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.153.100/24
    }
    track_script {
        chk_nginx
    }
}

副ノードの Keepalived 設定

# /etc/keepalived/keepalived.conf (副: 192.168.153.15)
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.153.100/24
    }
    track_script {
        chk_nginx
    }
}

設定ファイルとスクリプトを副ノードに転送後、両ノードで Keepalived を起動します。

systemctl enable --now keepalived

3. 動作確認

主ノードで ip a を実行すると、VIP(192.168.153.100)がバインドされていることを確認できます。

主ノードで Keepalived を停止すると、数秒以内に VIP が副ノードに移動します。

systemctl stop keepalived

その後、主ノードの Keepalived を再起動すると、VIP は再度主ノードに戻ります(プリエンプションが有効なため)。

systemctl start keepalived

タグ: nginx Keepalived HighAvailability VRRP linux

5月15日 00:20 投稿