nginx stream模块四层转发调优核心是稳、快、不断,重点在内核交互、缓冲控制与连接感知;需显式加载模块、独立stream块配置;长连接需设proxy_timeout、so_keepalive、proxy_responses;大流量需调proxy_buffer_size及读写超时;健康检查宜用passive模式配合backup实现务实故障切换。

用 Nginx stream 模块做四层高并发连接转发,核心不在“能不能转”,而在“稳不稳、快不快、断不断”。它不解析协议,只管连接生命周期,所以调优重点是内核交互、缓冲控制和连接感知——不是堆参数,而是让每个 TCP 连接跑得更久、更准、更少丢。
确保模块启用与配置位置正确
stream 模块必须显式加载且独立于 http 块,否则配置无效:
- 运行 nginx -V 2>&1 | grep with-stream,有输出才表示已编译支持
- 主配置 nginx.conf 顶部(events 同级)添加:
load_module modules/ngx_stream_core_module.so; - 所有 stream 配置必须写在 stream { ... } 块内,不能嵌套进 http 或其他块
- 推荐用 include 分离配置,例如:
stream { include /etc/nginx/stream-enabled/*.conf; }
针对长连接场景调优连接生命周期
MySQL、Redis 等数据库类服务依赖长连接,超时和保活设置不当会导致连接被中间设备(如防火墙、NAT)静默中断:
- proxy_timeout 1h:设为业务可接受的最大空闲时长,避免过早断连;MySQL 客户端默认 wait_timeout=28800(8 小时),此处略保守即可
- so_keepalive on:启用 TCP keepalive,内核自动探测连接活性,减少因网络抖动导致的假死
- proxy_responses 1:强制等待后端返回第一个响应包才认为连接建立成功,比仅靠三次握手更可靠,尤其防 mysqld 未就绪却已监听端口的情况
缓冲与吞吐适配大流量数据流
mysqldump、Redis bigkey 扫描、批量写入等操作会产生单次超大响应包,小缓冲会截断或触发重传:
- proxy_buffer_size 512k:建议设为 256K~1M,覆盖多数大结果集;注意该值是 per-connection 缓冲,高并发下需权衡内存占用
- proxy_send_timeout 和 proxy_read_timeout:按实际业务响应节奏设(如 30s~300s),避免慢查询拖垮整个连接池
- 若后端支持 PROXY 协议(如 HAProxy + MySQL),可在 server 块加 proxy_protocol on,透传客户端真实 IP
健康检查与故障切换要务实
stream 层健康检查本质是 TCP 探活,无法替代应用层心跳,但能快速剔除宕机节点:
- 使用 max_fails=3 fail_timeout=30s 配合 passive 检查(连接失败即记一次),适合大多数数据库部署
- 主动 health_check 需配合 health_check interval=3s fails=2 passes=2,但仅验证端口通,不保证服务可用
- 主从架构中,用 backup 标记从节点,主挂后自动切;不要依赖 active check 做读写分离,那是客户端或中间件的事











