Linux下Nginx备用节点自动切换需Keepalived+VRRP协同,通过VIP漂移实现;主备Nginx配置须完全一致,并配置应用层健康检查脚本防“假活”,同时规避脑裂风险。

Linux 下让 Nginx 实现备用节点故障自动切换,本质是解决 Nginx 本身单点问题——不能只靠它自己,得靠 Keepalived + VRRP 协同工作,用虚拟 IP(VIP)漂移来接管流量。
准备两台一致的 Nginx 节点
主备服务器都要装好相同版本的 Nginx,并确保配置完全一致:
- upstream 块指向相同的后端服务列表,启用 max_fails、fail_timeout 做基础健康探测
- proxy_pass、proxy_set_header X-Real-IP 等反向代理逻辑保持统一
- 静态资源路径、SSL 证书、日志格式等配置逐行比对,避免切换后因配置缺失导致 502/404
- 启动 nginx -t 验证语法,systemctl start nginx 并 curl 测试能否正常代理后端
用 Keepalived 管理 VIP 漂移
Keepalived 是核心调度器,负责在主节点异常时把 VIP(如 192.168.1.100)秒级绑定到备用节点:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 主节点 keepalived.conf 中设 state MASTER、priority 150;备节点设 state BACKUP、priority 100
- virtual_router_id 必须相同(如 51),auth_pass 设置密码(如 PASS 1111),防止非法节点加入
- virtual_ipaddress 块写明 VIP 和子网掩码(如 192.168.1.100/24),interface 填实际网卡名(ens160 或 eth0)
- 防火墙放行 VRRP 协议:firewall-cmd --add-protocol=vrrp --permanent && firewall-cmd --reload
加应用层健康检查防“假活”
仅靠 Keepalived 的网络心跳不够——Nginx 进程可能僵死但系统仍在响应 ping。必须主动检测服务可用性:
- 写一个检测脚本 /etc/keepalived/nginx_check.sh:
#!/bin/bash
curl -f http://127.0.0.1/healthz -o /dev/null -s || exit 1 - 在 keepalived.conf 里定义 vrrp_script,interval 设为 2 秒,weight -30(失败一次就降权)
- 在 vrrp_instance 中 track_script 引用该脚本,这样 Nginx 返回非 200 或超时,主节点优先级立刻低于备节点,触发切换
防脑裂与数据同步要点
主备同时抢 VIP 会导致服务中断或数据错乱,需提前规避:
- 用独立心跳线(如直连网线)或专用 VLAN 传 VRRP 包,不走业务网络
- 若后端是 MySQL 或文件服务,主备间必须开启 GTID 复制或 rsync 定时同步 Nginx 配置目录(/etc/nginx)和静态资源路径
- 切换脚本中可加入互斥判断,例如检查对方 MySQL 的 Seconds_Behind_Master 是否为 0,再决定是否允许接管写权限

















