NginxとKeepalivedによる高可用性クラスタ構築ガイド

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の設定 (バックアップサーバー)

バックアップサーバー側では、statepriority を変更します。

  • state: BACKUP
  • priority: 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 コマンド等で確認可能です。

タグ: nginx Keepalived linux 高可用性 サーバー構築

6月24日 19:04 投稿