nginx stream模块高效tcp转发需编译启用、顶层配置、协议适配和系统调优四点协同:确认nginx -v含with-stream;stream块与http平级;proxy_pass仅支持ip:port或upstream名;须调优worker_connections、epoll、so_keepalive及内核参数。

要让 Nginx 的 Stream 模块真正跑出高效 TCP 转发能力,关键不在堆参数,而在于编译、结构、协议适配和系统协同这四点全部到位。缺一不可。
确认模块已编译启用且版本兼容
Stream 模块从 1.9.0 起稳定支持,但默认不编译进二进制。运行 nginx -V 2>&1 | grep with-stream,有输出才说明可用。Ubuntu/Debian 推荐装 nginx-full;CentOS/RHEL 需单独安装 nginx-mod-stream 或使用官方源;Docker 场景直接用 nginx:alpine 或 nginx:mainline 镜像最省心。
配置必须放在顶层,与 http 平级
stream 块不能塞进 http 里,也不能缩进——否则 nginx -t 直接报错 “unknown directive 'stream'”。标准结构是:
- events { ... }
- stream { upstream xxx { ... }; server { ... } }
- http { ... }
若用 include 拆分,确保 include stream/*.conf; 这行写在 stream { } 大括号内部,而不是 http 块里。
proxy_pass 只认 ip:port 或 upstream 名
四层转发不解析协议,所以 proxy_pass 后面绝不能带 http://、https:// 或路径。正确写法是:proxy_pass 10.0.1.5:6379; 或 proxy_pass redis_backend;。如果后端用域名,必须配 resolver(如 resolver 8.8.8.8 valid=30s;),且 proxy_pass 中只写域名:端口,不加任何其他字符。
连接与内核级调优不能跳过
高并发下,光靠 Nginx 配置不够,还得动系统底层:
- worker_connections 设为 65536+,并显式指定 use epoll;(Linux)
- listen 指令中加 so_keepalive=on,防中间设备静默断连
- 设 proxy_timeout 1–5s,避免无效连接长期占位
- 调大系统参数:net.core.somaxconn(如 65535)、net.ipv4.ip_local_port_range(如 "1024 65535")
不复杂但容易忽略











