nginx stream模块实现tcp四层代理需确保模块启用、配置位置正确(顶层stream块)、长连接保活(so_keepalive与proxy_timeout协同)、缓冲适配大流量(proxy_buffer_size等)、负载均衡与被动健康检查。

用 stream 块做四层 TCP 代理,核心是让连接“稳得住、转得快、不断连”。它不解析协议内容,只管 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 /etc/nginx/stream-enabled/*.conf 分离配置,便于维护
长连接场景下保活与超时协同设置
MySQL、Redis 等服务依赖稳定长连接,中间防火墙或 NAT 设备容易静默中断空闲连接:
CentOS Stream 9是基于RHEL 9技术路线的持续交付版本,适合需要贴近RHEL 9生态的软件开发、系统集成和测试环境。它相比传统CentOS Linux更靠近上游开发过程,用户可以更早看到RHEL 9后续小版本中的软件包变化。CentOS Stream 9仍是当前可用的官方版本线之一,适合对稳定性和新功能之间有平衡需求的团队使用。
- so_keepalive=300s:15s:4:空闲 5 分钟后开始探测,每 15 秒发一次,连续 4 次无响应则断连,适配主流云环境 NAT 超时
- proxy_timeout 1h:设为业务可接受的最大空闲时长,需 ≥ keepalive 探测总耗时(如 300 + 15×4 = 360 秒),避免 Nginx 提前关闭连接
- 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 检查(连接失败即记一次),适合大多数数据库部署
- upstream 支持 least_conn、hash $remote_addr consistent 等策略,注意连接粒度负载均衡——每个 TCP 连接固定绑定一个后端
- 备用节点用 backup 标记,故障时自动接管,不参与常规轮询










