本記事では、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