nginx故障转移需双层协同:一是upstream层通过max_fails/fail_timeout、backup节点及nginx_upstream_check_module主动探测实现后端故障自动隔离;二是keepalived通过vip漂移实现nginx实例级高可用接管,确保入口不单点。

在 Nginx 中配置故障转移策略,核心是两层协同:**Nginx 自身对后端服务的故障感知与自动剔除**,以及**Nginx 实例之间的高可用接管(即 Nginx 本身不挂)**。单靠 upstream 的 backup 或健康检查,只能解决“后端服务器宕机”问题;而高并发下的真正高可用,必须同时解决“Nginx 入口自身宕机”这个单点风险。下面分两个关键层面说明实用配置方法。
一、Nginx 内部:upstream 层的后端故障转移
这是最基础也最常用的故障转移能力,让 Nginx 在反向代理时自动绕过失联或异常的后端节点。
-
使用
backup标识备用节点:在 upstream 块中明确标记某台服务器为备份,仅当所有非 backup 服务器都不可用时才启用。例如:
upstream app_servers {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup; # 仅当前两者全失效时启用
}-
启用主动健康检查(需第三方模块):官方 Nginx 不自带 HTTP 级健康探测,推荐编译安装
nginx_upstream_check_module,或使用 OpenResty(已集成)。配置示例如下:
upstream app_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
check interval=3 rise=2 fall=5 timeout=1 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}-
合理设置失败判定参数:
max_fails和fail_timeout控制连续失败多少次、在多长时间内触发临时摘除;建议生产环境设为max_fails=3 fail_timeout=30s,避免因瞬时抖动误判。
二、Nginx 实例层:Keepalived 实现入口级故障转移
这才是保障“Nginx 自身高可用”的关键——让两台(或以上)Nginx 服务器共用一个虚拟 IP(VIP),主节点挂了,备节点秒级接管,客户端无感知。
- 部署要求:至少两台同网段 Linux 服务器,安装 nginx + keepalived,配置完全一致(含证书、conf、静态资源)。
- 主节点 keepalived.conf 示例(优先级更高):
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # VIP,对外提供服务的统一入口
}
notify_master "/etc/keepalived/notify.sh master"
}-
备节点 keepalived.conf:仅修改
state BACKUP和priority 90即可。 -
注意点:VIP 必须和服务器真实 IP 同网段;防火墙需放行 VRRP 协议(协议号 112);Nginx 配置中的
listen应绑定0.0.0.0:80或 VIP,而非仅本机 IP。
三、增强可靠性的实用建议
光有切换还不够,高并发场景下还需防雪崩、保状态、可验证:
-
开启 proxy_next_upstream:让 Nginx 在遇到超时、502/503/504 等错误时,自动重试下一个 upstream 节点。例如:
proxy_next_upstream error timeout http_502 http_503 http_504; -
限制连接与队列:在 upstream 中加
max_conns=1024防止单节点被压垮;配合queue 128 timeout=30s(需 1.15.0+)实现请求排队,而非直接拒绝。 -
监控 VIP 切换与后端状态:通过 keepalived 的 notify 脚本发告警;用
curl -I http://192.168.1.100/health定期探测 VIP 可达性;Nginx 自带stub_status或 Prometheus exporter 拉取实时指标。











