nginx stream模块高性能tcp转发的关键在于理清连接生命周期、内核协同与配置边界,需确保模块启用、stream块同级放置、合理设置keepalive与超时、缓冲区及负载均衡策略。

要让 Nginx 的 Stream 模块真正发挥高性能 TCP 转发能力,关键不在堆参数,而在理清连接生命周期、内核协同和配置边界。它不处理协议内容,只管“连得稳、转得快、断得准”,所以调优必须落在 TCP 层本身。
确保模块启用且位置正确
这是所有配置的前提,出错直接启动失败:
- 运行
nginx -V 2>&1 | grep with-stream,有输出才代表已编译支持;Ubuntu/Debian 推荐装nginx-full,CentOS/RHEL 需额外安装nginx-mod-stream并确认模块已加载 -
stream { }必须与events和http同级,放在nginx.conf最外层;嵌套进http或缩进都会报unknown directive "stream" - 建议用
include /etc/nginx/stream-enabled/*.conf;拆分配置,但这一行必须写在stream { }块内部
长连接保活与超时协同设置
数据库、Redis 等服务依赖稳定连接,中间设备(如云厂商 NAT 网关)常静默中断空闲连接:
- 在
listen指令中启用so_keepalive=300s:15s:4:空闲 5 分钟后开始探测,每 15 秒一次,连续 4 次无响应则断连,适配主流云环境 -
proxy_timeout应设为 ≥ keepalive 总探测耗时(如 300 + 15×4 = 360 秒),避免 Nginx 提前关闭健康连接;常见值为360s或1h -
proxy_responses 1表示等待后端返回第一个响应包再确认连接就绪,比单纯三次握手更可靠,防止服务监听了端口但尚未初始化完成
大流量吞吐的缓冲与超时适配
单次大响应(如 mysqldump、Redis 扫描 bigkey)容易触发重传或截断,需按连接粒度精细控制:
-
proxy_buffer_size 512k:建议设为 256K~1M,覆盖多数大结果集;注意这是 per-connection 缓冲,高并发下需权衡内存占用 -
proxy_read_timeout 300s和proxy_send_timeout 60s:按业务实际响应节奏设定,避免慢查询拖垮整个连接池 - 若后端支持 PROXY 协议(如 HAProxy + MySQL),可在
server块加proxy_protocol on,透传客户端真实 IP
负载均衡与被动健康检查落地
Stream 层的健康检查本质是 TCP 探活,不能替代应用层心跳,但能快速剔除宕机节点:
- 用
max_fails=3 fail_timeout=30s配合 passive 检查(连接失败即记一次),适合大多数数据库部署 - 支持
least_conn、hash $remote_addr consistent等策略,注意连接粒度负载均衡——每个 TCP 连接固定绑定一个后端,不是请求级轮询 - 备用节点用
backup标记,故障时自动接管,不参与常规轮询











