nginx 开源版不支持 tcp 主动健康检查,需依赖 nginx_upstream_check_module(type=tcp)或 lua 自定义实现;前者每3秒建连探测端口连通性,后者通过 cosocket 定时轮询并动态剔除异常节点,二者均需规避 keepalive 冲突且须注意误判风险。

Nginx 开源版本身不支持 TCP 层的主动健康检查,必须依赖第三方模块或外部机制来实现。与 HTTP 健康检查不同,TCP 探测更底层、更轻量,适用于数据库(如 MySQL、Redis)、消息队列(如 Kafka)、自定义 TCP 服务等场景。
使用 nginx_upstream_check_module 实现 TCP 健康检查
该模块(淘宝开源,广泛用于生产环境)支持 type=tcp 模式,通过建立并立即关闭 TCP 连接来判断后端是否可连通:
- 在
upstream块中启用探测:check interval=3 rise=2 fall=3 timeout=1 type=tcp;
表示每 3 秒尝试一次 TCP 连接,连续 2 次成功则恢复上线,连续 3 次失败则标记为 down,单次连接超时 1 秒 - 无需配置
check_http_send或响应校验——TCP 模式只检测端口是否可连、SYN/ACK 是否返回,不发送应用层数据 - 每个
server行仍需设max_fails=0 fail_timeout=0,避免被动机制干扰主动探测结果 - 注意:不能与
keepalive指令共存,否则 Nginx 启动会报错
替代方案:用 Lua + cosocket 自定义 TCP 探活
若无法编译第三方模块,可在 OpenResty 环境中用 Lua 脚本实现轻量级 TCP 探测:
- 利用
resty.core.socket.tcp创建非阻塞 socket,设置 connect timeout(如 500ms) - 在定时器(
ngx.timer.every)中轮询各后端地址+端口,记录状态到 shared dict - 在
upstream中配合balancer_by_lua_block动态剔除异常节点 - 优点是灵活可控、无需重启;缺点是需自行维护状态同步与过期逻辑,不适合超大规模节点
配合系统工具做兜底检测
对于严格要求高可用的 TCP 服务,建议分层防护:
- 基础层:用
nginx_upstream_check_module的type=tcp做快速端口连通性检查 - 业务层:在应用侧暴露 HTTP 健康接口(如
/health?mode=tcp),由 Nginx 主动调用并解析 JSON 字段(如"db_connected": true) - 运维层:用 Prometheus + Blackbox Exporter 定期拨测 TCP 端口,并联动告警与自动修复流程
关键注意事项
TCP 健康检查虽快,但容易误判:
- 仅能确认“端口开放”,无法验证服务进程是否卡死、连接池是否耗尽、协议握手是否异常
- 防火墙或安全组可能放行 SYN 但丢弃后续包,导致探测成功但实际不可用
- 短连接频繁探测可能触发目标服务的连接数限制或被 IDS 误判为扫描行为
- 务必限制探测频率(建议 ≥2s)、超时时间(建议 ≤1s),并在生产环境开启 access_log 记录 check 请求以便审计











