Nginx stream块TCP代理可通过max_fails/fail_timeout实现被动健康检查,配合proxy_timeout控制连接超时,backup节点兜底故障转移,并借助日志解析或Lua主动探测提升可观测性。

在 Nginx 的 stream 块中做 TCP 代理(如数据库、Redis、MQ 或 WebSocket 后端),本身不支持 HTTP 层的健康检查和重试逻辑,但依然可以通过组合配置实现多节点故障感知与自动转移。
启用被动健康检查与自动剔除
stream 模块虽无主动探测,但可通过连接失败行为触发被动标记:
- 为每个
server显式配置max_fails=2 fail_timeout=10s,Nginx 在建连失败或握手超时时会计数,连续失败即临时标记为不可用 - 需配合
proxy_timeout设置合理值(如proxy_timeout 30s),避免空闲连接长期滞留,干扰故障判断 - 注意:该机制仅对新建连接生效;已建立的长连接不会被中断,但后续新请求不会再路由到该节点
配置 backup 节点实现故障接管
当主节点全部不可用时,backup 节点可作为兜底出口:
- 在 upstream 中明确标注
backup,例如:server 10.0.1.20:6379 backup; - backup 节点默认不参与轮询,仅当所有非 backup 节点被标记为 down 时才启用
- 建议至少配置一个 backup,且该节点应独立部署、资源隔离,避免与主集群共用同一故障域
限制并发与连接数防雪崩
TCP 层无请求体概念,单个连接可能承载大量业务流量,需从连接维度控流:
- 使用
limit_conn_zone和limit_conn控制客户端连接总数,防止某 IP 打爆后端 - 若使用 Nginx 1.23.3+ 开源版或 Nginx Plus,可在 stream 块中启用
queue指令,例如:queue 64 timeout=5s;,让超额连接排队而非直接拒绝 - 搭配系统级句柄限制(
ulimit -n)和内核参数(net.ipv4.ip_local_port_range),避免端口耗尽导致连接失败被误判为节点故障
暴露状态与联动告警
stream 模块不提供内置状态页,但可通过间接方式实现可观测性:
- 开启
error_log的 warn 级别,搜索 “connect failed”、“connection refused”、“timeout” 等关键词,定位频繁失败的 server 地址 - 结合 systemd 日志或 filebeat 收集 error_log,用脚本解析最近 1 分钟内某节点失败次数,超阈值即触发告警
- 若使用 OpenResty,可用 Lua 在 init_worker_by_lua_block 中定期调用 socket.connect() 主动探测关键 TCP 端口,并将结果写入共享内存或 prometheus metrics


















