nginx高可用双机热备通过keepalived实现vip漂移,主备需网络一致、nginx配置完全相同、keepalived三参数(state/priority/virtual_router_id)严格匹配,并配置nginx健康检查脚本防假死。

构建 Nginx 高可用双机热备,核心是让两台服务器共享一个对外服务的虚拟 IP(VIP),主节点正常处理流量,备节点实时监听;一旦主节点失联或 Nginx 崩溃,VIP 在 2–3 秒内自动漂移到备节点,客户端无感知切换。这不是冗余摆设,而是已在生产环境稳定运行超一年的轻量级容灾方案。
网络与系统基础必须对齐
主备协同的前提不是“装了软件”,而是底层完全一致:
- 两台服务器使用同一子网内的静态 IP(如主 192.168.1.10、备 192.168.1.11),VIP(如 192.168.1.100)不配置在任何物理网卡上,由 Keepalived 动态绑定
- 关闭 firewalld 或放行 TCP 80/443 端口 + VRRP 协议(IP 协议号 112)
- SELinux 设为 permissive 模式(setenforce 0),避免拦截 VRRP 组播通信
- 用 ip a 确认实际网卡名(如 ens33 或 eth0),Keepalived 配置中 interface 字段必须严格匹配,否则 VIP 无法绑定
Nginx 配置必须逐字相同
切换不是只换 IP,而是换“服务能力”。若主备返回不同页面、跳转不同后端、甚至返回 502,用户立刻感知异常:
- /etc/nginx/nginx.conf 中的 listen 端口、server_name、root 路径、proxy_pass 目标必须完全一致
- 若作反向代理,upstream 列表、max_fails、fail_timeout 等健康检查参数也需同步
- 建议静态页加标识便于验证:主节点写 WEB01 - MASTER,备节点写 WEB02 - BACKUP
- 每次修改后执行 nginx -t 校验语法,再 systemctl reload nginx
Keepalived 主备角色靠三要素联动生效
VRRP 不靠“名字”判断主备,而依赖三个硬性参数共同作用:
- state:主节点设为 MASTER,备节点为 BACKUP
- priority:主节点优先级更高(如 100),备节点略低(如 90),数值必须不同且在同一组内唯一
- virtual_router_id:主备必须完全一致(如 51),它是 VRRP 组的“身份证”,错一个就无法形成心跳组
必须加 Nginx 健康检查脚本防假死
默认 Keepalived 只检测网络连通性。如果 Nginx 进程僵死但仍在,VIP 不会漂移——这就是“假活”。真实场景必须引入服务级探测:
- 新建脚本 /etc/keepalived/nginx_check.sh,内容为:
curl -s --head http://127.0.0.1 | grep "200 OK" > /dev/null - 在 keepalived.conf 的 vrrp_script 块中调用它,设置 interval 2(每 2 秒检查)、weight -5(失败则降低本节点优先级)
- 将该脚本绑定到 vrrp_instance 下的 track_script,确保检测失败时 priority 跌至低于备节点,触发自动重选











