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/