nginx + keepalived 实现无单点故障 web 服务,依赖同网段、时间同步和端口放行前提,通过 vrrp 漂移 vip、健康检查防假活、配置一致保行为统一,并需手动验证 vip 漂移与服务切换可靠性。

用 Nginx + Keepalived 构建无单点故障的 Web 服务,核心是让两台服务器对外呈现为“一台”,靠虚拟 IP(VIP)统一入口,主挂了备立刻顶上,用户几乎感觉不到中断。这不是堆硬件,而是靠协议级协同——VRRP 管 VIP 漂移,健康检查防“假活”,Nginx 配置一致保行为一致。
同网段+时间同步+端口放行
这是所有高可用的前提,缺一不可:
- 两台服务器必须在同一个二层网络(如都接在同一交换机下),IP 在同一子网,比如主 192.168.1.10、备 192.168.1.11、VIP 设为 192.168.1.100
- 运行
ntpdate -u pool.ntp.org或配置 chronyd,确保时间误差 - 防火墙必须放行:TCP 80(或 443)端口供业务访问;IP 协议号 112(VRRP 组播,地址 224.0.0.18),不能只开 UDP 或只放端口
- SELinux 建议临时设为 permissive:
setenforce 0,避免策略拦截 VRRP 报文或绑定 VIP
Nginx 配置完全一致
切换后用户看到的页面、跳转逻辑、后端转发路径必须一模一样,否则就是“高可用但不可用”:
- 两台机器的
/etc/nginx/nginx.conf内容逐字相同,包括upstream列表、proxy_set_header设置、SSL 配置等 - 静态页可加简易标识便于验证,比如主节点
/usr/share/nginx/html/index.html写 “MASTER — 192.168.1.10”,备节点写 “BACKUP — 192.168.1.11” - 务必执行
nginx -t校验语法,再systemctl restart nginx,避免因配置错误导致切换后 502
Keepalived 主备+真实健康检查
别只依赖进程存在,要验证 Nginx 能真实响应请求:
- 主节点
state MASTER、priority 100;备节点state BACKUP、priority 90;virtual_router_id两台必须相同(如 51) - 网卡名(
interface)需与ip a输出一致,常见为ens33或eth0,填错 VIP 就绑不上 - 定义
vrrp_script chk_nginx,脚本内容为:curl -I http://127.0.0.1:80 -m 3 -f >/dev/null 2>&1,超时或返回非 2xx 就判定失败 - 在
vrrp_instance中用track_script绑定该检查,并设weight -5:一旦检查失败,优先级自动减 5,跌破备机优先级即触发漂移
验证关键动作是否可靠
上线前必须手动模拟故障,确认每个环节都按预期工作:
- 启动后运行
ip a,确认 VIP 仅出现在主节点网卡下,备节点没有 - 在主节点执行
systemctl stop nginx,3 秒内查备节点ip a是否已获得 VIP - 立刻从外部机器
curl http://192.168.1.100,应返回备节点页面且状态码 200 - 再启主节点 Nginx,观察 VIP 是否不漂回(若没配
nopreempt,它会抢回;配了则保持在备机,适合避免抖动)











