node.js通过nginx反向代理部署时需分层控制超时:proxy_read_timeout防响应卡死,keepalive_timeout与keepalive_requests协同管理连接复用,stream模块下proxy_timeout清理tcp空闲连接,max_conns+queue限流防过载。

Node.js 应用通过 Nginx 反向代理部署时,死连接(长时间空闲、挂起或半开连接)容易堆积,导致文件描述符耗尽、后端连接池占满、WebSocket 断连(如 1006 错误)等问题。关键不是“统一延长时间”,而是分层控制:区分建连、读响应、空闲等待、长连接复用等不同阶段,让 Nginx 主动、及时、精准地断开无效连接。
proxy_read_timeout 控制响应等待超时(防长事务卡死)
该参数决定 Nginx 等待后端(Node.js)返回完整响应体的最长时间,超时即主动关闭连接并返回 504。对导出报表、批量处理等长事务必须设合理上限:
- 普通接口建议设为 60–120 秒;
- 已知长任务(如 8 分钟导出)可设为 600–900 秒,但不可设为 0 或过大;
- WebSocket 场景必须设足够大——至少为心跳间隔 ×2 + 网络余量(例如心跳 30 秒,建议设 90 秒);
- 若 Node.js 使用
server.timeout = 60000(默认 60 秒),则proxy_read_timeout必须 ≤ 后端 timeout,否则 Nginx 会保留已失效连接。
keepalive_timeout 和 keepalive_requests 协同管理复用连接寿命
Nginx 复用到 Node.js 的上游连接,需防止“僵尸连接”滞留池中。两个参数必须配合后端实际配置:
-
keepalive_timeout:设为比 Node.js 的
server.keepAliveTimeout少 10 秒(如 Node.js 设 60000ms,则 Nginx 设 50s);设为 0 或大于后端值,会导致连接复用失败或枯竭; - keepalive_requests:生产环境建议设 1000–5000,避免连接刚复用几次就被强制关闭;设太低(如默认 100)会引发高频重建和 TIME_WAIT 暴涨;
- 必须搭配
proxy_http_version 1.1和proxy_set_header Connection "",否则复用不生效。
stream 模块下用 proxy_timeout 管理纯 TCP 空闲连接
若 Node.js 服务暴露的是裸 TCP(非 HTTP)、或使用自定义协议(如 MQTT、gRPC-HTTP2 透传),需启用 Nginx stream 模块:
- proxy_timeout 是唯一专管“已建立连接后的空闲静默时间”的参数;
- 计时起点是 TCP 三次握手完成(ESTABLISHED 状态),只看是否收发数据;
- 超时后 Nginx 主动 FIN 关闭连接,释放 fd 和 worker 资源;
- 它不干预建连、SSL 握手或后端处理逻辑,仅用于清理无活动连接。
辅助防护:max_conns + queue 防止单节点过载
即使后端能处理长事务,也不能让它无限制接收新连接。在 upstream 中显式限流:
- 为每个 Node.js 实例设置 max_conns=150~180(按其线程池/连接池上限的 80%~90% 设);
- Nginx ≥ 1.23.3 时,可追加 queue=5 timeout=30s,让超额请求排队而非直接拒绝;
- 配合 least_conn 调度算法,避免某实例被长连接“锁死”。
不复杂但容易忽略——死连接不是等它崩了才处理,而是靠分层超时参数提前识别、主动切断、健康复用。











