Keepalived + NGINX 高可用負載平衡架構實作手冊

 

一:方案概述

  • 目標:建構一個具備自動故障切換能力的 L4/L7 負載平衡系統
  • 工具:
    • NGINX Open Source:提供 HTTP/TCP 負載平衡能力
    • Keepalived:利用 VRRP 協定達成主備節點的自動切換
  • 適用情境:
    • 中小型內網服務
    • 私有雲、API Gateway 前端
    • 無需購買 F5 等昂貴設備但又需穩定性的場域

二:系統架構圖

  • 包含:
    • 用戶端 → VIP
    • 主節點(Primary NGINX + Keepalived)
    • 備節點(Backup NGINX + Keepalived)
    • 後端伺服器群
  • VIP(虛擬 IP)會在主機與備機之間切換,提供單一進入點

三:Keepalived 自動切換的原理說明

  • 基於 VRRP 協定

    • 主節點定時透過 LAN 廣播「我還在」的訊號(advertisement)
    • 備節點監聽這些訊號
  • 當主節點:

    • 拔掉網路線

    • NGINX 異常並被 track_script 偵測

    • 關機、系統異常

    • 停止 keepalived

      → 備節點會在 3 秒內自動判斷主節點已失效,搶下 VIP

  • 備節點會發送 gratuitous ARP 更新網段,客戶端會自動連到新的 VIP 位置


四:完整安裝與設定流程

✅ 1. 安裝元件(兩台都要)


sudo apt update
sudo apt install -y nginx keepalived

✅ 2. NGINX 設定範例(兩台相同)


upstream backend {
    server 192.168.0.21;
    server 192.168.0.22;
}
server {
    listen 80;
    location / {
        proxy_pass <http://backend>;
    }
}

✅ 3. Keepalived 設定(主 + 備)

主機:/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.100
    }
    track_script {
        chk_nginx
    }
}

備機:將 state 改為 BACKUPpriority 調低,例如 90


五:NGINX 健康監控腳本(防止 NGINX 掛掉仍持有 VIP)

/etc/keepalived/check_nginx.sh


#!/bin/bash
curl -sf <http://localhost/> > /dev/null || exit 1
exit 0

加權腳本配置(加入於主備機 keepalived.conf


vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
    fall 2
    rise 1
}


六:故障模擬與驗證

  • 拔掉主機網路線 → VIP 轉移至備機
  • 停止 nginx → VIP 被搶走
  • 恢復主機 → VIP 是否搶回依 nopreempt 設定而定
  • 使用 ip a 確認 VIP 是否切換
  • 使用 journalctl -u keepalived 查看日誌紀錄

七:延伸應用與建議

留言

這個網誌中的熱門文章

windows server 「虛擬化型保護的程式碼完整性」(Virtualization Based Protection of Code Integrity,VBS) 功能說明與設定

linux server - 檢查nvidia driver 異常並自動重新開機

Docker 應用: 再以建置好container狀況下 如何透過json設定檔設定 在修改 Working Directory 和 Restart Policy 設定