当前位置: 首页 > news >正文

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 服务器的默认参数调整为:

参数默认值含义
keepAliveTimeout5 s (5000 ms)空闲长连接允许的最大等待时间
headersTimeout60 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. 自定义值

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

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

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

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

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

更多深度优化建议:

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

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

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

http://www.xdnf.cn/news/1156285.html

相关文章:

  • @import导入css样式、scss变量用法、static目录
  • Java中List<int[]>()和List<int[]>[]的区别
  • PAT 1049 Counting Ones
  • 医学图像超分辨率重建深度学习模型开发报告
  • 如何用immich将苹果手机中的照片备份到指定文件夹
  • Word for mac使用宏
  • UniApp 常用UI库
  • 机器视觉---深度图像存储格式
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十五课——正弦波图像的FPGA实现
  • 数据存储方案h5py
  • 【C++基础】面试高频考点解析:extern “C“ 的链接陷阱与真题实战
  • MySQL详解三
  • MyBatis Plus高效开发指南
  • 第459场周赛
  • ESXi6.7硬件传感器红色警示信息
  • 详解Mysql解决深分页方案
  • Python类中方法种类与修饰符详解:从基础到实战
  • [simdjson] ondemand::value | object array
  • 低速信号设计之I3C篇
  • 嵌入式Linux:获取线程ID
  • gym 安装
  • PrimeTime:高级片上变化(AOCV)
  • Laravel 框架NOAUTH Authentication required 错误解决方案-优雅草卓伊凡
  • 分享如何在保证画质的前提下缩小视频体积实用方案
  • NISP-PTE基础实操——XSS
  • MybatisPlus-14.扩展功能-DB静态工具-练习
  • windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试
  • MySQL学习----Explain
  • Kubernetes (K8S)知识详解
  • 二阶 IIR(biquad)滤波器