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
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 会在高并发下保持更多空闲连接,需结合指标监控(如
netstat
、lsof
、应用 APM监控)。并建立完善的链接释放机制。负载均衡与代理 部署在 Nginx、HAProxy、云厂商 LB 之后,需保证下游和上游的超时配置一致,避免中间层提前断开。
安全与资源泄露 高超时若遇到恶意客户端维持空闲连接,可能造成资源耗尽(Slowloris 攻击)。可借助限流、IP 白名单、防火墙规则进行防护。
更多深度优化建议:
配置 HTTP/2 多路复用,进一步提升连接利用率
使用 Redis 或MQ消息队列、SSE做业务,而不是单纯长连接
在 Kubernetes 环境下,探讨 Service 和 Ingress 的超时策略如何协同