要让web服务真正“不掉线”,关键在于消除单点故障,通过nginx负载均衡与keepalived vip漂移协同构建高可用集群。

要让 Web 服务真正“不掉线”,关键不是堆机器,而是消除单点故障。Nginx 负责把请求合理分发出去,Keepalived 负责在 Nginx 出问题时立刻顶上——两者配合,才能形成有韧性的集群。
Nginx 作为负载均衡层的核心配置
Nginx 不只是反向代理,更是流量调度中枢。它需面向后端真实 Web 服务(如 Tomcat、PHP-FPM 或静态文件服务器)做健康分发:
- 使用 upstream 块定义后端服务器组,推荐启用 least_conn(最少连接)或 ip_hash(会话保持),避免某台后端过载
- 为每个 server 添加 weight 和 max_fails/fail_timeout 参数,让 Nginx 主动剔除异常节点
- 务必在 location 中添加 proxy_set_header,转发原始 Host、X-Real-IP、X-Forwarded-For 等头信息,确保后端日志和业务逻辑准确识别客户端
- 建议启用 proxy_next_upstream,当某台后端返回 502/503/timeout 时自动重试另一台,提升请求成功率
Keepalived 实现 VIP 自动漂移
VIP(虚拟 IP)是用户访问的唯一入口地址,它不绑定在物理网卡上,而由 Keepalived 动态管理。主备切换依赖 VRRP 协议和状态脚本:
- 两台 Nginx 服务器均安装 Keepalived,并配置相同 virtual_router_id 和 auth_pass,确保属于同一组
- 主节点 state MASTER、优先级设为 100;备节点 state BACKUP、优先级设为 90 —— 数值越大越优先接管 VIP
- 必须配置 vrrp_script 检查 Nginx 进程存活(例如用
killall -0 nginx或 curl 本地端口),并绑定到 vrrp_instance 中,否则 Keepalived 只看网络连通性,不感知 Nginx 是否真在工作 - 注意 interface 字段要与实际网卡名一致(如 ens33、eth0),错误会导致 VIP 无法绑定
关键细节与避坑要点
很多集群看似跑起来,却在故障时失效,往往卡在几个实操细节上:
- 防火墙必须放行 VRRP 组播(目标地址 224.0.0.18,协议 VRRP/112),CentOS 默认 firewalld 会拦截,建议临时关闭或加规则:
firewall-cmd --add-rich-rule='rule protocol value="112" accept' - SELinux 若开启,可能阻止 Keepalived 绑定 VIP,执行
setenforce 0或配置对应策略 - 健康检查脚本权限需为 755,且脚本中使用的命令(如 curl、killall)路径要写绝对路径(如
/usr/bin/curl),避免 systemctl 启动时环境变量缺失 - 测试切换时,别只 kill -9 nginx 进程——应模拟真实故障:停掉 nginx 服务、断开网线、或直接关机,观察 VIP 是否在 2–3 秒内完成漂移
验证与日常维护
上线后不能只靠“看起来正常”,要建立可重复验证机制:
- 用
ip addr show查看 VIP 是否出现在当前主节点网卡上;用systemctl status keepalived确认服务状态及日志中的 state 切换记录 - 从客户端持续 ping VIP,同时在主节点执行
systemctl stop nginx,观察 ping 是否中断(理想情况中断 ≤ 2 秒) - 定期检查后端服务器健康状态:Nginx 的
stub_status或自建 /health 接口 + Keepalived 的 check 脚本联动 - 升级前,在备节点先更新 Nginx 配置并 reload,确认无误后再手动触发主备切换,实现无缝滚动更新











