Nginxの高可用性(HA)を実現するためには、一般的にKeepalivedと組み合わせて仮想IP(VIP)を利用します。これにより、アクティブなサーバーに障害が発生した際、スタンバイサーバーへ自動的にサービスを切り替えるフェイルオーバー構成を構築できます。
環境構成
今回の構成では、以下の2台のサーバーを前提とします。
- プライマリサーバー (Master): 192.168.1.10
- バックアップサーバー (Backup): 192.168.1.11
- 仮想IP (VIP): 192.168.1.100
両サーバーにはNginxがインストールされ、稼働している状態を想定しています。
Keepalivedのインストール
両サーバーでKeepalivedをインストールします。CentOSやRHEL系のディストリビューションでは、yumコマンドで簡単に導入可能です。
yum install keepalived -y
インストール完了後、設定ファイル /etc/keepalived/keepalived.conf を編集してクラスタの動作を定義します。
Keepalivedの設定 (プライマリサーバー)
プライマリサーバー(Master)側の設定ファイル例です。Nginxの死活監視スクリプトとVRRPインスタンスの設定を定義します。
! Configuration File for keepalived
global_defs {
router_id NGINX_HA_MASTER
}
# Nginxの監視スクリプト定義
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 実行間隔(秒)
weight -20 # 異常時の優先度減算値
}
vrrp_instance VI_1 {
state MASTER # マスターサーバーとして設定
interface eth0 # ネットワークインターフェース名
virtual_router_id 51 # ルーターID(バックアップと同一にする)
priority 100 # 優先度(バックアップより高く設定)
advert_int 1 # VRRP広告の送信間隔
authentication {
auth_type PASS
auth_pass 2222 # 認証パスワード(バックアップと同一にする)
}
virtual_ipaddress {
192.168.1.100 # 仮想IPアドレス(VIP)
}
track_script {
chk_nginx # 監視スクリプトの実行
}
}
Keepalivedの設定 (バックアップサーバー)
バックアップサーバー側では、state と priority を変更します。
state: BACKUPpriority: 90 (Masterより低い値)
その他の設定(virtual_router_id, auth_pass, virtual_ipaddress)はMaster側と完全に一致させる必要があります。
監視スクリプトの作成
Nginxプロセスが停止しているかどうかを検知し、停止していれば再起動を試み、それでも復旧しない場合にKeepalivedを停止させるスクリプトを作成します。これにより、VIPがバックアップサーバーへ移動します。
ファイルパス: /etc/keepalived/check_nginx.sh
#!/bin/bash
# Nginxプロセス数をカウント
PROCESS_COUNT=$(ps -C nginx --no-header | wc -l)
if [ "$PROCESS_COUNT" -eq 0 ]; then
# Nginxを起動試行
/usr/sbin/nginx
sleep 2
# 再度プロセス確認
PROCESS_COUNT=$(ps -C nginx --no-header | wc -l)
if [ "$PROCESS_COUNT" -eq 0 ]; then
# 起動失敗時はKeepalivedを停止してフェイルオーバー
systemctl stop keepalived
fi
fi
作成したスクリプトには実行権限を付与します。
chmod +x /etc/keepalived/check_nginx.sh
動作確認とテスト
両サーバーでKeepalivedとNginxを起動します。
systemctl start nginx
systemctl start keepalived
ブラウザから仮想IP (192.168.1.100) にアクセスし、Nginxのデフォルトページが表示されることを確認します。この時点では、優先度の高いプライマリサーバーがVIPを保持しています。
フェイルオーバーテスト
プライマリサーバーでKeepalivedサービスを停止し、意図的に障害を発生させます。
systemctl stop keepalived
この状態で再度VIPへアクセスすると、サービスが途切れることなくバックアップサーバーが応答していることが確認できます。また、プライマリサーバー上のIPエイリアスが消え、バックアップサーバーにVIPが付与されていることを ip addr コマンド等で確認可能です。