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 的超时策略如何协同

相关推荐
Littlewith1 天前
Node.js:Stream、模块系统
java·服务器·开发语言·node.js·编辑器
Moment1 天前
Next.js 15.4 正式发布:Turbopack 全面稳定,预热 Next.js 16 😍😍😍
前端·javascript·node.js
小刀飘逸1 天前
typeorm部署问题
node.js·orm
爱分享的程序员1 天前
前端面试专栏-工程化:26.性能优化方案(加载优化、渲染优化)
前端·javascript·node.js
_Kayo_1 天前
node.js学习笔记1
笔记·学习·node.js
这是个栗子2 天前
【问题解决】npm包下载速度慢
前端·npm·node.js
whhhhhhhhhw2 天前
Node.js链接MySql
node.js
kevinfkq2 天前
Node.js下载安装及环境配置教程
node.js
前端老鹰2 天前
Node.js 数据验证的终极解决方案:zod 模块深度剖析
node.js