要真正提升nginx stream模块tcp转发吞吐性能,需从内核、事件模型、连接生命周期和缓冲四方面协同优化:对齐ulimit与worker_rlimit_nofile、调大somaxconn与tcp_max_syn_backlog、启用epoll及multi_accept、配置so_keepalive与合理缓冲超时。

要真正提升 Nginx Stream 模块的 TCP 转发吞吐性能,不能只调大某个参数,得从内核、事件模型、连接生命周期和缓冲四方面协同优化。单点改动往往压测时突然失败,比如连接拒绝或 too many open files。
对齐系统级资源上限
Stream 处理的是原始 TCP 连接,每个连接至少占 1 个文件描述符。如果 worker_connections 设为 16384,但 nginx 进程的 ulimit -n 还是默认 1024,那实际最多只能建 1024 个连接——其余请求会被静默丢弃。
- 在 /etc/security/limits.conf 中为运行用户(如 www-data 或 nginx)添加:
www-data soft nofile 65536
www-data hard nofile 65536 - 在 nginx.conf 的主配置块中写:
worker_rlimit_nofile 65536; - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",确认 soft 和 hard 值都 ≥ worker_connections × worker_processes
匹配内核 accept 队列长度
内核为每个 listen socket 维护一个“已完成三次握手、等待 accept()”的队列,长度由 net.core.somaxconn 控制。默认值常为 128,瞬时建连高峰会直接丢 SYN-ACK,客户端表现为连接超时,Nginx 日志里却无记录。
- 设 net.core.somaxconn ≥ worker_connections ÷ worker_processes,并留余量。例如 4 核配 4 个 worker、每个 16384 连接,则单 listen socket 理论需承载约 4096 个待取连接,建议设为 8192 或 16384
- 同步调高 net.ipv4.tcp_max_syn_backlog(未完成连接队列),推荐设为 somaxconn 的 2 倍,防 SYN 包被丢弃
- 执行:
sysctl -w net.core.somaxconn=16384
并写入 /etc/sysctl.conf 永久生效
启用高效事件机制
Stream 不走 HTTP 流程,对事件模型更敏感。若未显式指定,Nginx 可能回退到 select,触发 1024 连接硬限制。
- 确保 events 块中配置:
use epoll;
multi_accept on;
accept_mutex on;(默认开启,保持即可) - 这些设置让单个 worker 能一次性 accept 多个就绪连接,减少系统调用,提升并发吞吐
适配长连接与大流量缓冲
数据库、Redis 等场景依赖稳定长连接,且常有大结果集(如 mysqldump、bigkey 扫描),小缓冲会截断响应或触发重传。
- 启用保活探测:
listen 3306 so_keepalive=300s:15s:4;(空闲 5 分钟后开始探测,每 15 秒一次,连续 4 次失败断连) - 设超时匹配保活逻辑:
proxy_timeout 1h;(需 ≥ idle + interval × probes = 300 + 15×4 = 360 秒) - 增大缓冲区:
proxy_buffer_size 512k;(覆盖多数大结果集;注意这是 per-connection 缓冲) - 按业务节奏调超时:
proxy_read_timeout 300s;
proxy_send_timeout 60s;











