防止单点故障需架构级冗余:Upstream层用健康检查与智能调度,后端层统一健康接口、Session外置、数据库主从分离,Nginx层通过Keepalived+VIP双机热备,并建立可观测性与应急机制。

防止单点故障不能只靠“多装几台 Nginx”,关键是在架构层面做冗余备份与高可用协同——既要让流量进得来、切得快,也要让后端稳得住、状态不丢。
Upstream 层:用主动健康检查 + 智能调度替代轮询
默认的 upstream 轮询没有状态感知能力,后端挂了还在转发,必须叠加探测和策略:
- 显式配置每台后端的容错参数:
max_fails=3 fail_timeout=30s,30 秒内连续失败 3 次即临时下线 - 启用
nginx_upstream_check_module或自定义location /health,通过定时 GET 请求检测真实服务状态,仅返回 HTTP 200 且含"status":"UP"才视为健康 - 根据业务类型选算法:无状态 API 用加权轮询(
weight),会话类系统配ip_hash+ Redis 共享 Session,长连接服务(如 WebSocket)优先least_conn - 所有
proxy_pass前必须设超时:proxy_connect_timeout 5s控制建连,proxy_read_timeout 60s防止慢响应拖垮整机 - 预留
backup节点,仅当全部主节点不可用时才启用,适合部署低配灾备实例
后端服务层:统一健康端点 + 状态外置 + 数据分离
Nginx 再可靠,后端一崩全链路失效。高可用的前提是后端能自证健康:
- 所有应用暴露标准健康接口(如
/health或 Spring Boot 的/actuator/health),禁止指向业务路径(如/api/user),避免误判 - Session 必须外置到 Redis 集群(非单点),确保任意 Nginx 实例转发请求都能还原上下文
- 数据库强制主从分离,应用层开启自动故障转移(failover),并配置定时备份脚本(如每天凌晨 3 点执行全量导出)
Nginx 自身层:Keepalived + VIP 双机热备
Nginx 进程本身不能成为单点,需用虚拟 IP(VIP)对外提供统一入口:
- 两台服务器均安装 Nginx 和 Keepalived,配置相同反向代理规则
- 主节点
priority 101,备节点priority 99;通过vrrp_script每 2 秒检测nginx -t && pgrep nginx,失败则降权触发 VIP 漂移 - VIP 绑定在物理网卡(如
ens160),主备virtual_router_id必须一致,确保 VRRP 协议正常协商 - 防火墙需放行 VRRP 多播地址
224.0.0.18和协议号112,否则心跳中断导致脑裂
可观测性与应急兜底机制
高可用不是“配完就完事”,要持续验证和快速响应:
- 接入 Prometheus + Grafana,监控 Nginx 连接数、5xx 率、upstream 状态码分布、Keepalived 主备角色变化
- 配置告警规则:如连续 3 次健康检查失败、VIP 在 10 秒内发生两次切换、某 upstream server 被标记
down超过 60 秒 - 准备应急脚本:一键手动触发 VIP 切换、临时关闭某 upstream server、快速回滚最近一次配置变更


















