要让Nginx Stream模块发挥高性能TCP代理能力,关键在于确保模块启用、配置置于顶层stream块内、并按协议特性调优连接参数(如proxy_responses、proxy_timeout、so_keepalive等),同时配合系统级与worker级调优。

要让 Nginx 的 Stream 模块真正发挥高性能 TCP 代理能力,关键不是堆参数,而是理清三层关系:模块是否可用、配置结构是否合规、连接行为是否适配业务协议。下面直击实操要点。
确认 Stream 模块已就绪
很多问题其实卡在第一步——模块根本没启用。运行以下命令验证:
nginx -V 2>&1 | grep with-stream
有输出说明编译时已包含;若无输出,不能仅靠重装 nginx 包解决:
- Ubuntu/Debian 用户应安装 nginx-full(而非默认的 nginx-light)
- CentOS/RHEL 请启用 EPEL 仓库后安装 nginx-mod-stream 或使用官方 nginx.org 提供的 stable 包
- Docker 场景推荐直接用 nginx:mainline 或 nginx:alpine 镜像,它们默认启用 stream
配置必须放在顶层 stream 块中
Stream 配置和 http 块完全隔离,不能嵌套、不能混用。常见错误是把 server 写在 http { } 里,或漏掉 stream { } 外层包裹:
✅ 正确结构:
stream {
upstream app_backend {
server 10.0.2.5:8080;
server 10.0.2.6:8080;
}
server {
listen 8000;
proxy_pass app_backend;
}
}
⚠️ 注意事项:
- 所有 stream 相关指令(upstream、server、proxy_pass)只能出现在 stream { } 内
- 不支持 rewrite、add_header、access_log 等 HTTP 层功能
- 建议将具体规则拆到 /etc/nginx/stream.d/*.conf,再用 include 引入,便于维护
按协议特性调关键代理参数
TCP 代理不是“一配了之”,不同服务对连接生命周期要求差异极大:
- Redis / MySQL 类请求-响应协议:设 proxy_responses 1,收到首个响应即确认连接有效,提升健康检查灵敏度
- SSH / MQTT / 长连接服务:关闭响应计数限制,设 proxy_timeout 1h 或更高,避免空闲断连
- 高吞吐二进制流(如 MySQL dump):增大 proxy_buffer_size 512k,防止缓冲区溢出触发重传
- 所有监听建议加 so_keepalive=on,防中间网络设备静默断连
配套系统与 worker 级调优
Nginx 本身只是入口,底层系统才是并发上限的决定者:
- events 块中启用 use epoll;(Linux),并设 worker_connections 65536
- 内核参数调整(需写入 /etc/sysctl.conf):
- net.core.somaxconn = 65535(提升 accept 队列长度)
- net.ipv4.ip_local_port_range = 1024 65535(扩大可用端口范围)
- net.ipv4.tcp_fin_timeout = 30(加快 TIME_WAIT 回收)
- 单机万级连接时,务必检查 ulimit -n 并设为 65536+,否则会报 “too many open files”


















