nginx tcp代理连接池管理需启用stream模块并配置keepalive:在stream块中为每个后端单独定义upstream,显式设keepalive n、keepalive_timeout、proxy_socket_keepalive,并禁用proxy_buffering;同时server块中配proxy_pass、proxy_timeout等,缺一不可。

要在 Nginx 中为 TCP 代理配置后端连接池管理,核心是启用 stream 模块的 keepalive 功能,而非 HTTP 层的长连接机制。TCP 层没有 HTTP 的 Connection 头,因此必须依赖 upstream 块内显式声明连接复用能力,并配合超时与缓冲控制。
启用 stream 模块并定义带 keepalive 的 upstream
Nginx 默认不编译 stream 模块,需确认启动时含 --with-stream。配置时必须在 stream { } 块中定义 upstream,并直接在其内部启用连接池:
- 每个
upstream块应只面向一类后端(如 MySQL、Redis),避免混用不同服务或协议 - 写明具体 IP + 端口(禁用域名,防止 DNS 解析干扰连接归属)
- 添加
keepalive 32;—— 表示每个 worker 进程对该 upstream 最多缓存 32 个空闲 TCP 连接 - 不使用
ip_hash或least_conn等调度策略(TCP 连接复用依赖“固定目标”,调度会打散连接绑定)
设置连接生命周期与保活参数
仅设 keepalive N 不足以稳定复用,还需控制连接存活时间与底层探测:
-
keepalive_timeout 60s;:空闲连接最长保留时间,建议比后端服务的空闲关闭阈值小 5–10 秒 -
proxy_buffering off;:TCP 层必须禁用缓冲,防止粘包或延迟;stream模块默认关闭,但显式声明更可靠 -
proxy_socket_keepalive on 60s 5s 3;:对上游 socket 启用保活探测(空闲 60 秒后每 5 秒发心跳,3 次失败即断开),专治防火墙/WAF 静默断连
代理 server 块中的关键选项
server 块负责监听和转发,需匹配后端协议行为:
-
listen 3306;或对应端口,推荐绑定具体 IP(如listen 0.0.0.0:3306) -
proxy_pass mysql_backend;:指向已定义的 upstream 名称 -
proxy_timeout 30s;:整个连接空闲超时,建议 ≤ 后端wait_timeout(如 MySQL 默认 28800 秒,此处设 30 秒指无数据交互时限) -
proxy_responses 1;:适用于短会话协议(如 MySQL 登录后执行单条语句);若为长连接服务(如自定义 TCP 协议),应设为0或省略
验证连接池是否生效
不能只看配置语法正确,需通过实际指标确认:
- 在后端服务器运行
ss -s | grep -i "tcp.*established\|time_wait":复用正常时,established数趋于平稳,time_wait显著下降 - 在 Nginx 侧开启
error_log /var/log/nginx/stream.log debug;,搜索keepalive connection reused或create connection日志行 - 压测期间观察后端连接数增长是否明显低于 QPS 增幅(理想情况接近线性饱和而非指数上升)











