Nginx单点故障可通过Keepalived主备+VIP方案解决:主备需同网段、配置一致virtual_router_id和认证,配合Nginx健康检查脚本实现秒级无感切换。

单点故障是 Web 服务最常见也最危险的隐患之一。Nginx 本身不支持集群,一旦它所在的服务器宕机,整个前端服务就中断。用 Keepalived 和 Nginx 联合部署,核心就是让两台(或更多)Nginx 服务器共享一个虚拟 IP(VIP),由 Keepalived 实时监控主节点状态,故障时秒级切换 VIP 到备用节点——用户无感知,服务不中断。
主备节点必须在同一网段
Keepalived 基于 VRRP 协议工作,依赖组播通信检测主备状态。主节点持续发送 VRRP 广播报文,备节点监听;若连续收不到(默认 3 秒),就触发切换。这意味着:
- 主、备服务器的物理网卡(如 ens33)必须在同一个二层网络(同一 VLAN 或物理交换机直连)
- VIP 必须是该网段内未被占用的闲置 IP,不能和任何真实主机 IP 冲突
- 防火墙需放行 VRRP 组播地址 224.0.0.18 和协议号 112,否则心跳失效
Keepalived 配置关键项不能错
配置文件 /etc/keepalived/keepalived.conf 中几个参数决定切换逻辑是否可靠:
- state MASTER / BACKUP:明确角色,不要都设为 MASTER
- priority 数值:主节点优先级必须高于备节点(如 100 vs 90),且差值要大于脚本权重变化量
- virtual_router_id:同一组主备必须一致,取值 1–255,避免与其他 VRRP 实例冲突
- authentication:建议启用密码认证(auth_pass),防止非法节点加入 VRRP 组
必须加入 Nginx 健康检查脚本
仅靠 Keepalived 检测进程存活不够——Nginx 进程还在,但 worker 全卡死、无法响应请求,这时 VIP 不该留在故障节点上。推荐做法是:
- 写一个简单脚本(如 /etc/keepalived/nginx_check.sh),用 curl -I http://127.0.0.1:80 测试 HTTP 返回码是否为 200
- 在 keepalived.conf 中定义 vrrp_script,设置 interval(如 2 秒执行一次)、weight(如 -20)
- 将该 script 关联到 vrrp_instance,当检测失败时,主节点优先级自动扣减,低于备节点即触发切换
验证切换是否真正生效
部署后不能只看 VIP 是否飘过去,要模拟真实故障场景验证端到端可用性:
- 用浏览器或 curl 访问 VIP,确认返回的是当前持有 VIP 节点的页面(比如页面中嵌入了本机 IP)
- 手动 systemctl stop keepalived(或 kill -9 主节点 keepalived 进程),观察 VIP 是否在 1–3 秒内迁移到备节点
- 再次访问 VIP,确认服务恢复且内容来自备节点;再启主节点,观察 VIP 是否不自动抢回(除非配置了 nopreempt=false)
- 可临时停掉主节点的 nginx 服务,验证健康检查是否触发切换,而非等 keepalived 进程挂掉才动作











