当前位置: 首页 > 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.lryc.cn/news/594149.html

相关文章:

  • 基于Pytorch的人脸识别程序
  • 【JS逆向基础】数据库之redis
  • 华为开源自研AI框架昇思MindSpore应用案例:基于ERNIE模型实现对话情绪识别
  • 对于stm32RCT6的外部中断
  • `tidyverse` 中涉及的函数及其用法
  • tabBar设置底部菜单选项、iconfont图标(图片)库、模拟京东app的底部导航栏
  • GPT-4o mini TTS:领先的文本转语音技术
  • 私有云新势力:Puter+CPolar如何低成本替代商业网盘?
  • Softhub软件下载站实战开发(十九):软件信息展示
  • 42.sentinel实现线程隔离
  • 学习日志15 python
  • JAVA面试宝典 -《容灾设计:异地多活架构实践》
  • nvm、npm、pnpm、cnpm、yarn
  • Python适配器模式详解:让不兼容的接口协同工作
  • 【C语言】内存函数介绍(上)
  • 【单片机外部中断实验修改动态数码管0-99】2022-5-22
  • 从零开始的云计算生活——番外5,使用ELK实现对应用日志的监控
  • 多源异构数据融合的理论与方法
  • Modbus Slave 使用教程:快速搭建模拟从站进行测试与开发
  • JavaScript 语言基础详解
  • 论文笔记:Seed: Bridging Sequence and Diffusion Models for RoadTrajectory Generation
  • TD3与SAC强化学习算法深度对比
  • [Python] -项目实战4- 利用Python进行Excel批量处理
  • Valgrind Memcheck 全解析教程:6个程序说明基础内存错误
  • 无线通信相关概念
  • LeetCode 1712.将数组分成三个子数组的方案数
  • 基于卷积傅里叶分析网络 (CFAN)的心电图分类的统一时频方法
  • 复杂度+包装类型+泛型
  • @import导入css样式、scss变量用法、static目录
  • CSS中Padding与Margin的区别