Nginx高可用集群部署:Keepalived实现VIP双机热切换配置详解

Nginx作为主流反向代理和负载均衡器,单节点部署存在单点故障风险。通过Keepalived实现VRRP协议下的VIP(虚拟IP)双机热切换,是生产环境中保障Nginx高可用的标准方案。本文从安装部署到故障切换测试,完整梳理配置流程。

Keepalived高可用架构原理

Keepalived基于VRRP(虚拟路由冗余协议)实现主备切换。两台Nginx服务器分别作为MASTER和BACKUP,共享一个VIP对外提供服务。MASTER节点周期性发送VRRP通告,BACKUP节点在超时未收到通告时接管VIP。切换过程对客户端透明,通常在1到3秒内完成。

架构设计要点:两台服务器部署在不同物理机或不同可用区,避免同机故障导致双节点同时不可用。VIP配置在公网网段,DNS解析指向该VIP。Nginx进程异常时,Keepalived的track_script检测机制触发VIP切换。

Keepalived安装与基础配置

以CentOS 7/8环境为例,通过yum安装Keepalived:

yum install -y keepalived nginx
systemctl enable keepalived nginx

MASTER节点Keepalived配置文件/etc/keepalived/keepalived.conf:

global_defs {
    router_id NGINX_MASTER
}

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

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

    authentication {
        auth_type PASS
        auth_pass MyStr0ngP@ss
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        chk_nginx
    }

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault  "/etc/keepalived/notify.sh fault"
}

BACKUP节点的配置差异在于state设为BACKUP,priority设为90(低于MASTER的100)。virtual_router_id必须与MASTER一致,否则VRRP通告无法识别。auth_pass主备必须相同,长度不超过8个字符。

Nginx健康检查脚本编写

Keepalived本身只检测网络层面的VRRP通告,无法感知Nginx进程是否正常工作。通过track_script机制,自定义检测脚本判断Nginx存活状态:

#!/bin/bash
# /etc/keepalived/check_nginx.sh
# 检测Nginx进程是否存在
if [ -z "$(pgrep nginx)" ]; then
    systemctl restart nginx
    sleep 2
    if [ -z "$(pgrep nginx)" ]; then
        echo "Nginx is DOWN"
        exit 1
    fi
fi
exit 0

脚本逻辑:先尝试重启Nginx,重启后再次检测,仍失败则返回非零退出码。weight -20配置使得MASTER节点检测失败后priority降为80,低于BACKUP的90,触发VIP切换。fall 3表示连续3次检测失败才判定异常,rise 2表示连续2次成功才恢复,避免网络抖动导致频繁切换。

BACKUP节点配置与切换测试

BACKUP节点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 MyStr0ngP@ss
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        chk_nginx
    }
}

切换测试步骤:在MASTER节点执行systemctl stop nginx停止Nginx服务,观察VIP漂移情况。使用ip addr命令在两台机器上分别检查VIP绑定状态:

# MASTER节点停止Nginx后
ip addr show eth0 | grep 192.168.1.100
# 无输出,VIP已释放

# BACKUP节点
ip addr show eth0 | grep 192.168.1.100
# inet 192.168.1.100/24 scope global eth0
# VIP已漂移到BACKUP节点

恢复MASTER节点的Nginx后,由于MASTER的priority(100)高于BACKUP(90),VIP自动回切到MASTER节点。如果不希望自动回切(避免二次抖动),在BACKUP节点配置nopreempt参数,但需要将BACKUP的state也设为MASTER,通过priority决定初始角色。

故障通知与日志监控

notify.sh脚本在VIP切换时触发告警通知:

#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
HOSTNAME=$(hostname)
VIP=192.168.1.100
TIME=$(date "+%Y-%m-%d %H:%M:%S")

case $STATE in
    master)
        MSG="$TIME $HOSTNAME 成为MASTER,接管VIP $VIP"
        ;;
    backup)
        MSG="$TIME $HOSTNAME 降级为BACKUP,释放VIP $VIP"
        ;;
    fault)
        MSG="$TIME $HOSTNAME 进入FAULT状态"
        ;;
esac

# 发送告警(企业微信/钉钉/邮件)
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \
  -H 'Content-Type: application/json' \
  -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MSG\"}}"

logger -t keepalived "$MSG"

Keepalived日志默认输出到/var/log/messages,通过journalctl -u keepalived -f实时查看VRRP通告和状态切换记录。生产环境中建议将日志单独剥离到/var/log/keepalived.log,便于排查切换异常。

安全加固方面,VRRP协议的auth_pass应使用强密码,避免局域网内被恶意节点抢占VIP。如果两台服务器跨网段部署,需确保VRRP协议的组播地址224.0.0.18在中间网络设备上放行,或改用unicast_peer配置单播模式。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-gao-ke-yong-ji-qun-bu-shu-keepalived-shi-xian-vip/

(0)
小编小编
上一篇 15小时前
下一篇 15小时前

相关推荐