Nginx Stream模块的so_keepalive是启用内核TCP keepalive机制,用于探测空闲连接防中间设备断连,非连接池复用;其参数格式为so_keepalive=idle:interval:probes,需与proxy_timeout协同配置以确保有效保活。

so_keepalive 的作用与原理
当客户端与 Nginx stream 建立 TCP 连接后,若长时间无数据交互,中间设备可能因超时清理连接。启用 so_keepalive on 后,内核会在连接空闲时自动发送 TCP keepalive 探针(默认:2 小时后开始,每 75 秒一次,连续 9 次失败则关闭连接)。该机制完全由 OS 内核执行,Nginx 不参与数据构造,仅透传字节流。
合理配置 so_keepalive 参数
默认值通常过于保守(如 Linux 默认 idle=7200s),需根据业务场景缩短探测周期。可在 listen 指令中显式设置:
- so_keepalive=on:启用 keepalive,使用系统默认参数
- so_keepalive=300s::3:空闲 300 秒后开始探测,间隔未指定(用系统默认),失败 3 次即断连
- so_keepalive=60s:10s:5:空闲 60 秒后首次探测,后续每 10 秒探一次,连续 5 次无响应则关闭连接
例如 MySQL 代理常用:listen 3306 so_keepalive=60s:10s:3; —— 适配云环境常见 5 分钟 NAT 超时。
配合 proxy_timeout 避免连接僵死
so_keepalive 解决的是“被中间设备静默断连”,而 proxy_timeout 控制的是 Nginx 自身对空闲连接的生命周期管理。二者需协同:
- 若 proxy_timeout 远小于 keepalive 探测周期(如设为 10s),连接会在探测前就被 Nginx 主动关闭,so_keepalive 失效
- 建议 proxy_timeout ≥ so_keepalive idle + (probe_interval × fail_count),例如 60s + (10s × 3) = 90s,实际可设为
proxy_timeout 2m - MySQL 场景推荐:
proxy_timeout 1h; so_keepalive=300s:15s:4;
其他影响连接稳定性的关键项
keepalive 只是链路保活一环,还需同步调优:
-
proxy_connect_timeout:控制与后端建连耗时,数据库类服务建议设为
3s,避免慢节点拖累整体 -
proxy_buffer_size:增大缓冲区(如
512k)防止大结果集(mysqldump、Redis bigkey)触发截断或重连 - proxy_responses 1:确保首包响应到达才认为后端可用,提升健康判断准确性,间接减少无效 keepalive 流量
注意:这些参数均在 server 块内配置,且必须位于 stream 上下文中,不可写入 http 块。



















