nginx tcp代理连接池优化核心是每个worker进程对后端维持适量空闲tcp连接,需启用stream模块、定义专用upstream并配置keepalive 32、keepalive_timeout 60s、proxy_socket_keepalive on 60s 5s 3、proxy_buffering off,server块中配proxy_pass、proxy_timeout等,再通过ss命令和debug日志验证复用效果。

Nginx 处理 TCP 代理连接的资源管理与连接池优化,核心在于让每个 worker 进程对后端服务维持适量、可控、可复用的空闲 TCP 连接,从而避免频繁建连带来的系统开销和 TIME_WAIT 暴涨,同时防止连接堆积压垮后端。
启用 stream 模块并定义专用 upstream
stream 模块必须显式编译启用(启动时含 --with-stream),且所有 TCP 代理配置必须在 stream { } 块内完成。每个 upstream 应专用于一类后端服务(如仅 MySQL 或仅 Redis),不混用协议或用途:
- 写死后端地址:使用 IP + 端口,禁用域名(避免 DNS 解析干扰连接归属)
- 不启用调度策略:如
ip_hash、least_conn,TCP 连接复用依赖“固定目标”,调度会破坏连接绑定关系 - 示例配置:
upstream mysql_backend {<br> server 10.0.1.100:3306;<br> keepalive 32;<br> keepalive_timeout 60s;<br>}
精细化控制连接生命周期
仅设 keepalive N 不足以保障稳定复用,需配合超时与底层保活参数协同控制:
-
keepalive_timeout 60s:空闲连接最长保留时间,建议比后端服务的 wait_timeout 小 5–10 秒(如 MySQL 默认 28800 秒,此处设 60 秒更合理) -
proxy_socket_keepalive on 60s 5s 3:对上游 socket 启用 TCP keepalive 探测(空闲 60 秒后每 5 秒发心跳,3 次失败即断开),专治防火墙或中间设备静默断连 -
proxy_buffering off:TCP 层必须禁用缓冲,防止粘包或转发延迟;stream 模块默认关闭,但显式声明更可靠
代理 server 块的关键转发行为控制
server 块负责监听客户端请求并转发,其参数直接影响连接使用效率和协议兼容性:
-
listen 3306;或listen 0.0.0.0:3306:推荐绑定具体 IP,避免泛监听引发安全或路由问题 -
proxy_pass mysql_backend;:必须指向已定义的 upstream 名称,不可直连 IP -
proxy_timeout 30s;:整个连接无数据交互的空闲超时,适用于短会话协议;长连接服务应设为 0 或省略 -
proxy_responses 1;:表示每个客户端连接只转发一次请求(适合 MySQL 登录+单语句场景);若为持续通信的自定义 TCP 协议,应设为 0 或删除该行
验证连接池是否真实生效
配置正确 ≠ 效果达成,需通过实际指标确认复用效果:
- 在后端服务器执行
ss -s | grep -i "tcp.*established":复用正常时,established 数应显著低于客户端并发数,且趋于平稳 - 检查 Nginx error log(开启
error_log ... debug):搜索reuse connection或close idle connection日志,确认连接复用与清理行为 - 对比
netstat -an | grep :3306 | wc -l与 Nginx 的stream_upstream_connections_idle指标(需 Prometheus + nginx-vts-exporter):两者应基本一致











