nginx 实现 grpc 故障转移依赖 grpc_pass 重试与 upstream 被动健康检查,需配置 grpc_next_upstream、keepalive、backup 及禁用缓冲等参数保障流稳定。

Nginx 对 gRPC 服务实现自动故障转移,核心在于结合 grpc_pass 的重试机制与 upstream 的被动健康检查,同时严格适配 HTTP/2 连接生命周期。它不依赖主动探测,而是通过请求级失败反馈触发切换,稳定且无需额外组件。
启用 grpc_next_upstream 触发重试
这是 gRPC 故障转移的起点:当某次流式调用失败时,Nginx 需主动尝试其他后端节点,而不是直接返回错误。
- 在 location 块中配置
grpc_next_upstream error timeout;—— 表示连接失败或超时时重试 - 添加
grpc_next_upstream_tries 2;限制最多重试 1 次(共最多 2 次转发) - 搭配
grpc_next_upstream_timeout 10s;防止重试过程无限等待 - 注意:
http_500等状态码不适用于 gRPC 场景,gRPC 错误由grpc-status头传递,Nginx 不解析该头,因此不建议加入
upstream 中配置 max_fails + fail_timeout 实现节点下线
让 Nginx 在连续失败后临时剔除异常 gRPC 后端,避免持续发送请求到已卡住或崩溃的服务进程。
- 每个
server行需显式设置max_fails=3 fail_timeout=30s - 失败判定依据是
grpc_connect_timeout或底层 TCP 连接失败、RST 等,不是 gRPC status code - 确保
keepalive 2000;开启连接池,复用长连接,减少建连失败干扰健康判断
添加 backup 节点承接全量故障流量
当所有主节点被标记为不可用时,backup 服务器作为灾备兜底,自动接管全部请求。
- 在 upstream 中追加一行:
server 192.168.1.99:50051 backup max_fails=2 fail_timeout=20s; - backup 节点也支持独立的健康参数,防止自身异常导致雪崩
- 生产环境建议将 backup 部署在不同可用区,避免同机房级故障影响
禁用缓冲并延长超时保障流稳定性
gRPC 是长连接多路复用流,若 Nginx 缓冲或过早断连,会导致 stream 中断、Stream removed before completed 等错误,间接引发“假故障”转移。
- 必须设置
grpc_buffering off;,避免内部缓存破坏流边界 -
grpc_read_timeout 3600;和grpc_send_timeout 3600;适配空闲流或大文件传输 -
reset_timedout_connection off;关键项:禁止超时后主动发送 RST,保护仍在活跃的 stream











