Nginx+Keepalived是电商高可用底线,通过VIP毫秒级漂移(1.8秒内)、主动HTTP健康检查(curl探测/health端点)、调优心跳(advert_int 0.5s)、强化upstream韧性(max_fails、slow_start、proxy_next_upstream)及内核参数优化(tcp_tw_reuse等)实现无感知故障恢复。

大型电商场景下,Nginx 与 Keepalived 的组合不是“可选配置”,而是高可用底线。双十一大促期间,单点 Nginx 故障可能意味着每秒数万订单流失——真实压测中,我们曾观测到主节点宕机后 1.8 秒内完成 VIP 漂移,用户无感知刷新即恢复,这背后是配置、检测、协同三者的严丝合缝。
健康检查脚本必须做主动探测
仅依赖 Keepalived 自带的进程存活检测远远不够。Nginx 进程在但 upstream 全挂、或 SSL 握手卡死、或 worker 被慢请求占满时,服务已不可用,但进程仍在运行。
- 写一个独立 shell 脚本(如 /etc/keepalived/check_nginx.sh),用 curl -I -s -o /dev/null -w "%{http_code}" http://127.0.0.1/health 检查真实 HTTP 健康端点
- 返回码非 200 则 exit 1;超时设置为 2 秒以内(-m 2)
- 脚本权限设为 755,属主为 root,并在 keepalived.conf 的 global_defs 中启用 enable_script_security 并指定 script_user root
主备切换参数要适配电商流量特征
电商大促时连接爆发式增长,心跳太慢会延迟故障发现,太快又增加网络抖动风险。默认 1 秒心跳在多数场景下偏保守。
- advert_int 设为 0.5(500ms),配合 fail 和 rise 参数控制灵敏度(例如 fall 2 rise 3)
- 避免使用抢占模式(nopreempt 在 backup 节点开启),防止主节点短暂抖动引发反复切换
- priority 差值建议 ≥ 50(如 master=100,backup=40),确保角色稳定,不因小幅度优先级波动误切
Nginx 层需同步强化反向代理韧性
Keepalived 解决的是入口 IP 的高可用,而真正承载业务的是 Nginx 的反向代理能力。若 upstream 配置不当,VIP 切换后仍会大量超时。
- upstream 必须启用 max_fails=3 fail_timeout=30s,并搭配 slow_start=60s 防止新节点上线时被突发流量打垮
- proxy_next_upstream 至少包含 error timeout http_502 http_503 http_504,允许自动重试失败请求
- 对关键接口(如下单、支付)单独定义 upstream,并配置 ip_hash 或 sticky cookie,保障会话连续性
VIP 漂移后连接平滑接管有技巧
Linux 内核默认不立即回收 TIME_WAIT 连接,导致 VIP 切换后旧连接无法快速复用端口,新请求可能被拒绝。
- 在 sysctl.conf 中启用 net.ipv4.ip_local_port_range = 1024 65535 扩大可用端口池
- 设置 net.ipv4.tcp_tw_reuse = 1,允许 TIME_WAIT 套接字用于新连接(需时间戳支持)
- 调整 net.ipv4.tcp_fin_timeout = 30,缩短 FIN_WAIT_2 状态超时,加速资源释放


















