🌐

自宅サーバーのNginxを冗長化してみた

に公開

自宅サーバーのNginxを冗長化してみた

初めに

Proxmoxでクラスタリングをしていても、Nginxが動いている物理サーバーが落ちるとWebサービスがすべて止まってしまうという問題がありました。特に家庭用の自宅サーバー環境では、ハードやソフトの安定性が商用環境に比べて弱く、再起動やクラッシュは避けられません。そこで、Keepalived を使ってNginxを冗長化し、どちらかのノードが落ちてもサービスを継続できるようにしました。


構成

  • 物理ノード2台 (Proxmox VE)
  • 各ノード上に LXC コンテナで Nginx を配置
  • VIP (Virtual IP) を Keepalived で制御
  • LAN内のアドレス設計
ノード IP 役割
nginx1 192.168.0.96 MASTER
nginx2 192.168.0.97 BACKUP
VIP 192.168.0.95 仮想IP

ルータのポートフォワーディングは VIP (192.168.0.95) に設定することで、外部からアクセスしても常にアクティブなNginxへ接続されるようにしています。


手順

1. LXCコンテナの複製

既存のNginxコンテナをフルクローンして2台目に配置しました。

2. Keepalivedの導入

両方のLXCにインストール。

apt update -y
apt install keepalived -y

nginx1 (MASTER) の /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1234
    }

    virtual_ipaddress {
        192.168.0.95
    }
}

nginx2 (BACKUP) の /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1234
    }

    virtual_ipaddress {
        192.168.0.95
    }
}

実際のテスト

  1. MASTER 側コンテナで VIP を確認
ip addr show eth0
192.168.0.96/24
192.168.0.95/32  ← VIPが割り当てられている
  1. VIPに対して ping 実行
ping 192.168.0.95
  • 応答は nginx1 (MASTER) から返ってきます。
  1. MASTERをシャットダウンしてみる
shutdown -h now
  • ssh接続が切断され、ネットワークから消えます。
  1. BACKUP 側で VIPの引き継ぎを確認
ip addr show eth0
192.168.0.97/24
192.168.0.95/32  ← VIPがBACKUPに移動
  1. VIP経由でNginxにアクセス
curl http://192.168.0.95
  • ページが正常に返ってくることを確認。

まとめ

これで、どちらかのサーバーやNginxコンテナが落ちても、もう一方がVIPを引き継いでサービスを継続できることが確認できました。
Keepalivedを利用することでシンプルに冗長化を実現できたのは大きなメリットです。

今後は、コンフィグや、Let's Encryptの証明書更新を両ノードで同期させる仕組みを追加して、さらに安定性を高めていきたいです。

GitHubで編集を提案

Discussion