proxy_timeout专管tcp连接建立后的空闲超时,仅在stream模块生效,计时起点为三次握手完成,超时即主动断连;需配合proxy_connect_timeout、健康检查及内核参数协同优化。

Nginx 在 TCP 代理模式下实现连接的超时自动断开,关键在于用对 proxy_timeout 参数——它专管已建立连接后的空闲时长,不是“全链路”超时,也不参与建连或响应传输过程。
proxy_timeout 管什么、怎么生效
这个参数只在 stream 模块中有效,作用非常明确:
- 计时起点:TCP 三次握手完成,连接已进入 ESTABLISHED 状态
- 计时对象:上下游之间完全无数据收发的静默时间
- 超时动作:Nginx 主动关闭该连接,释放文件描述符和 worker 资源
- 不干预的环节:DNS 解析、SSL 握手、后端处理耗时、客户端侧连接状态
必须写在 stream 块里,位置不能错
写在 http 或 location 里无效。正确写法示例:
(放在 nginx.conf 的顶层,不在 http 块内)
stream {
upstream db_pool {
server 10.0.1.100:3306;
server 10.0.1.101:3306;
}
server {
listen 3307;
proxy_pass db_pool;
proxy_timeout 1h; # ← 关键:1 小时内无数据即断
proxy_connect_timeout 5s; # ← 另一个参数,只管建连阶段
}
}
取值要匹配业务场景,不是越长越好
默认 10 分钟,对多数长连接服务偏短;但设为 0(禁用)需谨慎:
- MySQL/Redis 代理:常设 30m~2h,需与后端
wait_timeout对齐 - 有心跳机制的服务(如 MQTT、自定义心跳 TCP):设为略大于心跳间隔(例如心跳 45s →
proxy_timeout 60s) - 无心跳纯长连接:可设 0,但必须确认后端有连接清理兜底逻辑,否则易堆积僵死连接
- 单位必须显式标注:支持
s、m、h,如30s、5m、1h
单靠 proxy_timeout 不够,得配齐搭档
它只解决“静默断连”,要保障整体连接稳定性,还需协同:
-
proxy_connect_timeout:控制建连阶段(SYN 发出到收到 SYN-ACK),按网络 RTT 设 3–15 秒 - 健康检查:stream 模块需用
nginx_upstream_check_module或 Nginx Plus 的health_check,避免持续打到宕机节点 - Linux 内核调优:如
net.core.somaxconn和net.ipv4.tcp_max_syn_backlog,防止高并发下内核丢包导致建连失败











