Nginx Stream TCP代理性能关键在连接复用、内核承载与业务适配参数:需启用--with-stream编译选项,配置置于顶层stream块,按协议设proxy_timeout/proxy_responses,配合upstream keepalive及内核参数(如somaxconn=65535)和客户端连接池。

用 Nginx Stream 模块做 TCP 代理,性能好坏不只看配置写得漂不漂亮,关键在三点:连接能不能复用、内核能不能扛住、参数是不是贴合业务。下面直接说能落地的实践要点。
确认并启用 Stream 模块
很多预装版 Nginx(比如 Ubuntu 默认 apt 安装的)并不带 Stream 支持。别跳过这步,否则配置写完也跑不起来:
- 运行 nginx -V 2>&1 | grep with-stream,有输出才算启用
- 没输出?推荐换用官方 stable 包(nginx.org 提供),或安装 nginx-full(Debian/Ubuntu)
- 若必须编译,configure 时加 --with-stream,别漏掉
基础代理结构要放对位置
Stream 配置和 HTTP 完全隔离,错嵌套就无效:
- 必须写在 nginx.conf 顶层,和 http 块平级,不能塞进 http { } 里
- 推荐用 include /etc/nginx/stream.d/*.conf 拆分配置,便于按服务管理
- 每个 server 块代表一个监听端口(如 listen 3306),不是 HTTP 虚拟主机
核心性能参数要按协议调
proxy_timeout、proxy_responses 这些不是设个默认值就行,得看后端是什么协议:
- MySQL/PostgreSQL:proxy_timeout 设为 1h,proxy_responses 设为 1(握手只回 1 包)
- Redis:proxy_timeout 1–5s 即可,短连接场景;加 so_keepalive=on 防中间设备断连
- 长连接自定义服务:proxy_responses 省略或设为 0,避免提前关连接
- 缓冲区不够会丢包:proxy_buffer_size 按实际调大(如 MySQL dump 场景设 512k)
连接复用和系统级协同才真提效
单靠 Nginx 配置没法突破瓶颈,必须配合内核和连接池:
- upstream 里加 keepalive 32(建议值),再配 keepalive_timeout 60s,复用后端连接
- Linux 内核调优不可少:net.core.somaxconn、net.ipv4.tcp_max_syn_backlog 至少调到 65535
- 客户端也要配合:用连接池(如 HikariCP、Netty ChannelPool),别频繁新建连接
- worker 层面:events 块中 worker_connections 设为 65536+,搭配 use epoll



















