Node.js Express keep-alive 超时时间设置

背景介绍

随着 Web 应用并发量不断攀升,长连接(keep-alive)策略已经成为提升性能和资源复用的重要手段。本文将从原理、默认值、优化实践以及潜在风险等方面,全面剖析如何在 Node.js(Express)中正确设置和应用 keep-alive 超时时间。

例如我们是BI系统,需要做ETL处理,而ETL处理有些过程相对漫长,这个时候需要进行长连接等待。

一、长连接与 keep-alive 简述

长连接,即 HTTP keep-alive,是指在一次 TCP 连接建立后,可以复用该连接处理多次 HTTP 请求/响应,从而避免频繁的三次握手和四次挥手,从网络层、系统调用层面大幅减少延迟和资源消耗。

关键指标:

  • keepAliveTimeout:空闲长连接在被销毁之前,允许等待新请求的最长时间。

  • headersTimeout:在同一连接上,等待客户端发送完整 HTTP 请求头的最长时间,超过该时间会强制关闭连接。

二、Node.js 默认超时值

Node.js从 v13.0.0 开始,将底层 HTTP 服务器的默认参数调整为:

参数 默认值 含义
keepAliveTimeout 5 s (5000 ms) 空闲长连接允许的最大等待时间
headersTimeout 60 s (60000 ms) 等待客户端完整请求头的最大时限

可以看到,默认仅保留 5 秒的空闲长连接,如果你的应用存在请求间隔较长、或需要保持连接的场景(如物联网设备推送、长轮询),就需要手动调整。

三、为什么要调整 keep-alive 超时

  • 减少连接抖动:当客户端频繁发起短暂空闲后才真正发起请求时,5 秒可能不足以维持长连接,导致高并发场景下频繁重建 TCP 连接。

  • 资源复用:适当延长空闲超时,可降低操作系统的 TCP 状态切换、内核内存分配等开销。

  • 提升用户体验:对于需要长时间保持通道通信的应用(如实时推送、游戏服务器),延长 keep-alive 可减少重连延迟。

四、在 Express 中设置超时时间

Express 底层就是基于Node.js HTTP 模块,因此你可以通过 app.listen() 返回的 server 实例,直接修改其超时属性。

javascript

javascript 复制代码
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

/**
* To set the keep-alive timeout to 30 minutes (1800 seconds) in an Express app, you need to access the underlying HTTP server and set its keepAliveTimeout property.
* Express 本身是基于 Node.js 的 HTTP 模块,默认支持 HTTP 长连接(keep-alive)。要让连接保持最长 30 分钟(1800 秒),你需要设置 HTTP 服务器的 keep-alive 超时时间。
*
* In Node.js, the default keepAliveTimeout for the underlying HTTP server is 5 seconds (5000 ms) as of Node.js v13.0.0 and later.
* The default headersTimeout is 60 seconds (60000 ms).
* keepAliveTimeout: How long to keep an idle keep-alive connection open.
* headersTimeout: How long to wait for the complete HTTP headers after a connection is established.
*
* @author Moshow@https://zhengkai.blog.csdn.net/
*/
const server = app.listen(port, () => {
  logger.info(`My App listening on port ${port}`);
});
// Set keep-alive timeout to 1800 seconds (30 minutes)
server.keepAliveTimeout = 1800 * 1000; // milliseconds
server.headersTimeout = 1810 * 1000; // should be slightly higher than keepAliveTimeout

 

五、对比:默认值 vs. 自定义值

参数 默认值 示例自定义值 建议策略
keepAliveTimeout 5 000 ms 1 800 000 ms 如果应用请求间隔较长,可根据业务场景调整至分钟级;缓存或推送类服务推荐 15--30 分钟。
headersTimeout 60 000 ms 1 810 000 ms 始终略高于 keepAliveTimeout,以免在等待请求头时过早断开连接。

六、设置超时时的注意事项

  • 内存与连接数监控 延长 keep-alive 会在高并发下保持更多空闲连接,需结合指标监控(如 netstatlsof、应用 APM监控)。并建立完善的链接释放机制

  • 负载均衡与代理 部署在 Nginx、HAProxy、云厂商 LB 之后,需保证下游和上游的超时配置一致,避免中间层提前断开。

  • 安全与资源泄露 高超时若遇到恶意客户端维持空闲连接,可能造成资源耗尽(Slowloris 攻击)。可借助限流、IP 白名单、防火墙规则进行防护。

更多深度优化建议:

  • 配置 HTTP/2 多路复用,进一步提升连接利用率

  • 使用 Redis 或MQ消息队列、SSE做业务,而不是单纯长连接

  • 在 Kubernetes 环境下,探讨Service 和 Ingress 的超时策略如何协同

相关推荐
没事别瞎琢磨3 小时前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨4 小时前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨5 小时前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨5 小时前
七、敏感路径预检——Protected Paths
人工智能·node.js
没事别瞎琢磨5 小时前
五、进程执行——spawn、超时与进程树清理
人工智能·node.js
没事别瞎琢磨5 小时前
四、命令风险分级与审批策略
人工智能·node.js
没事别瞎琢磨5 小时前
三、配置系统——默认值与解析
人工智能·node.js
右耳朵猫AI7 小时前
Node.js周刊2026W22 | Node.js 26、Deno 2.8、Rolldown 1.0、TypeORM 1.0、Bun v1.3.14
node.js
没事别瞎琢磨7 小时前
二、类型系统——给所有概念起名字
人工智能·node.js
Java.熵减码农10 小时前
Hermes Agent 安装踩坑记录:DNS 解析失败 & Node.js 幽灵文件冲突
node.js·ai编程·hermes