nginx stream模块tcp代理稳定性关键在于连接生命周期协同控制:需确认--with-stream编译支持、配置置于顶层stream块;长连接须so_keepalive与proxy_timeout配对设;大流量调大proxy_buffer_size并关闭proxy_buffering;upstream keepalive池复用后端连接。

要让 Nginx 的 Stream 模块真正稳住 TCP 代理,关键不是堆参数,而是让连接“不被断、不被卡、不被误判”。它不解析协议,只管连接生命周期,所以稳定性来自对底层网络行为的预判和协同控制。
确认模块启用并放对位置
Stream 不是插件,是编译时决定的能力。运行 nginx -V 2>&1 | grep with-stream,有输出才算真正支持。配置必须写在 nginx.conf 顶层,与 events 同级,不能嵌套进 http 块里。推荐用 include /etc/nginx/stream-enabled/*.conf 把配置拆开,避免主文件臃肿出错。
长连接场景:keepalive 与 timeout 必须配对设
MySQL、Redis 这类服务依赖长连接,但中间防火墙或云 NAT 往往 5 分钟就静默断连。单设 proxy_timeout 没用,得和 so_keepalive 协同:
- so_keepalive=300s:15s:4:空闲 5 分钟后开始探测,每 15 秒发一次,连续 4 次无响应才断——这个总耗时(360 秒)就是 proxy_timeout 的底线
- proxy_timeout 600s:设为略大于 keepalive 总耗时,给后端留缓冲余地,避免 Nginx 自己先关连接
- proxy_responses 1:等后端返回第一个包再认为连接建好,比单纯靠三次握手更靠谱,防服务端口开了但进程还没 ready
大流量吞吐:缓冲与超时按实际节奏调
mysqldump 导出、Redis 扫 bigkey,响应体可能达几百 MB。小缓冲会截断、重传甚至触发连接重置:
- proxy_buffer_size 512k:建议设 256K~1M,这是每个连接独占的内存,高并发下需权衡总量
- proxy_read_timeout 300s:慢查询常见耗时,设太短会直接中断传输
- proxy_send_timeout 60s:控制向后端发数据的等待上限,避免单个慢写拖垮整个 worker
连接复用:upstream keepalive 池才是降压核心
客户端连 Nginx 的连接没法复用(TCP 层没 keep-alive 概念),但 Nginx 到后端的连接可以池化:
- 在 upstream 块里加 keepalive 32:设为后端单机处理能力的 1/2~1/3,比如 MySQL 默认 max_connections=151,那池子设 32 是安全的
- 配套 keepalive_timeout 60s:空闲连接保活时长,过长积压僵死连接,过短频繁重建
- proxy_buffering off:显式关闭,防止 stream 模块缓冲导致粘包或延迟,尤其对实时性要求高的协议
不复杂但容易忽略











