Nginx开源版stream模块不支持TCP健康检查,需借助Nginx Plus或第三方模块nginx_upstream_check_module实现;后者通过check指令配置TCP连接探测,参数含interval、rise、fall和type;无模块时可用nc脚本+重载兜底。

在 Nginx 中,原生 HTTP 模块不支持 TCP 层的健康检查,也就是说,使用 stream 上下文做 TCP 代理(如 MySQL、Redis、TLS 等)时,upstream 默认 没有内置的主动健康探测机制。要实现 TCP 代理下的上游节点可用性保障,需借助第三方模块或变通方案。
使用 nginx-plus 或开源替代:nginx_upstream_check_module
官方开源版 Nginx(nginx.org 发布)不包含 TCP 健康检查功能。常见可行路径是:
- 采用 Nginx Plus(商业版),它在
stream块中支持health_check指令,可配置基于 TCP 连接、SSL 握手或自定义二进制探针的健康检测; - 或为开源 Nginx 手动编译添加 nginx_upstream_check_module —— 这是一个成熟社区模块,支持
http和stream的主动健康检查(需注意其 stream 分支兼容性,推荐使用适配较新 Nginx 版本的 fork,如nginx-stream-upstream-check)。
stream 块中启用健康检查的基本配置示例
以已集成 upstream_check 模块的 Nginx 为例(假设已正确编译):
stream {
upstream backend_tcp {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
check interval=3 rise=2 fall=3 timeout=1 type=tcp;
}
server {
listen 3306;
proxy_pass backend_tcp;
proxy_timeout 10s;
proxy_responses 1;
}
}
说明:
-
check指令开启健康检查:interval=3表示每 3 秒探测一次; -
rise=2表示连续 2 次成功则标记为 up;fall=3表示连续 3 次失败才标记为 down; -
type=tcp表示仅尝试建立 TCP 连接(不发应用层数据),适用于 MySQL、PostgreSQL、Redis 等; - 若需更严格验证(如 Redis 的
PING或 MySQL 的握手响应),需选用支持type=ssl_hello或自定义send/expect的增强版模块(如某些定制分支)。
无模块时的轻量级兜底策略
若无法引入第三方模块,可结合系统工具 + Nginx 重载实现简易可用性管理:
- 用
nc -z或timeout 1 bash -c 'cat < /dev/null > /dev/tcp/192.168.1.10/3306' 2>/dev/null定期探测端口; - 脚本根据结果动态生成
upstream配置(只保留存活节点),再触发nginx -s reload; - 该方式有秒级延迟与重载开销,适合低频变更、非核心链路,不建议用于高并发或强一致性场景。
注意事项与调试建议
启用 TCP 健康检查后需关注:
- 确保防火墙/安全组放行探测源 IP 到上游端口的连接请求;
- 避免检查频率过高导致上游服务连接数压力(尤其对 MySQL 等有连接池限制的服务);
- 通过
nginx -t验证配置语法,并查看 error log 中upstream check相关日志确认探测是否生效; - 部分模块要求在编译时显式启用
--add-dynamic-module=...,且运行时需加载load_module指令(如load_module modules/ngx_http_upstream_check_module.so;)。










