Nginx+Keepalived双机热备核心是统一VIP、自动故障切换、服务不中断;主备节点同网段、时间同步、放行VRRP和HTTP端口;Nginx配置一致,Keepalived通过curl健康检查防假死;验证VIP漂移、防脑裂、查日志定位问题。

用Nginx和Keepalived搭双机热备,核心就三点:统一对外IP、自动故障切换、服务不中断。主节点扛流量,备节点全程监听;一旦主挂了,VIP几秒内漂到备机,用户几乎无感。这不是理论,是已在电商、金融、政务系统中稳定跑满一年以上的生产方案。
环境准备与基础安装
先确保两台服务器(比如192.168.1.10和192.168.1.11)同网段、时间同步、防火墙放行VRRP组播(协议号112)和HTTP 80端口。
- CentOS系执行:yum install epel-release nginx keepalived -y
- Ubuntu系执行:apt update && apt install nginx keepalived -y
- 选一个未被占用的虚拟IP(如192.168.1.100)作为对外服务地址,所有客户端只访问这个VIP
- 确认两台机器的网卡名一致(常用eth0或ens33),后续配置需严格匹配
Nginx负载均衡配置(双机完全一致)
让两台Nginx都具备相同转发能力,避免切换后行为不一致。重点不是做复杂策略,而是保证功能等效。
- 编辑/etc/nginx/nginx.conf,在http块内添加upstream后端池,例如指向两个应用服务器192.168.1.20和192.168.1.21
- server块监听80端口,proxy_pass必须指向该upstream名称,同时设置proxy_set_header X-Real-IP $remote_addr保留源IP
- 重启前用nginx -t校验语法,再执行systemctl restart nginx
Keepalived主备配置与健康检查
Keepalived不只管VIP漂移,更关键的是判断“Nginx到底还活着没”。光看进程存在不够,得真正能响应请求才算健康。
- 主节点(192.168.1.10)的/etc/keepalived/keepalived.conf中设state MASTER、priority 100
- 备节点(192.168.1.11)对应设为state BACKUP、priority 90,virtual_router_id必须相同(如51)
- 务必定义vrrp_script chk_nginx:用curl -I http://127.0.0.1:80 >/dev/null代替简单的killall -0 nginx,防“进程在但服务卡死”
- 将该脚本绑定到vrrp_instance里,用track_script调用,weight值建议设为-5~-10,确保检测失败时优先级足够低而触发切换
验证与常见问题处理
配置完别急着上线,按步骤逐项验证,很多故障其实发生在测试环节就被暴露了。
- 分别在两台机器运行ip a,确认VIP初始只出现在主节点的网卡上
- 手动停主节点Nginx:systemctl stop nginx,3秒内查备节点是否已获得VIP,且curl http://192.168.1.100仍可通
- 模拟脑裂风险:断开主备间网络(拔网线或iptables封VRRP端口),观察是否两边同时持有VIP——若出现,说明没配nopreempt或健康检查逻辑有缺陷
- 日志排查看/var/log/messages,关键词包括"Master transition"、"Remove an address"、"chk_nginx"


















