背景介绍

随着 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.pswp.cn/bicheng/89966.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89966.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89966.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习C++、QT---30(QT库中如何自定义控件(自定义按钮)讲解)

每日一言你比想象中更有韧性,那些看似艰难的日子,终将成为勋章。自定义按钮我们要知道自定义控件就需要我们创建一个新的类加上继承父类,但是我们还要注意一个点,就是如果我们是自己重头开始造控件的话,那么我们就直接…

【补充】Linux内核链表机制

专题文章:Linux内核链表与Pinctrl数据结构解析 目标: 深入解析Pinctrl子系统中,struct pinctrl如何通过内核链表,来组织和管理其多个struct pinctrl_state。 1. 问题背景:一个设备,多种引脚状态 一个复杂的…

本地部署Dify、Docker重装

需要先安装一个Docker,Docker就像是一个容器,将部署Dify的空间与本地环境隔离,避免因为本地环境的一些问题导致BUG。也确保了环境的统一,不会出现在自己的电脑上能跑但是移植到别人电脑上就跑不通的情况。那么现在就开始先安装Doc…

【每天一个知识点】非参聚类(Nonparametric Clustering)

ChatGPT 说:“非参聚类”(Nonparametric Clustering)是一类不预先设定聚类数目或数据分布形式的聚类方法。与传统“参数聚类”(如高斯混合模型)不同,非参聚类在建模过程中不假设数据来自于已知分布数量的某…

人形机器人CMU-ASAP算法理解

一原文在第一阶段,用重定位的人体运动数据在模拟中预训练运动跟踪策略。在第二阶段,在现实世界中部署策略并收集现实世界数据来训练一个增量(残差)动作模型来补偿动态不匹配。,ASAP 使用集成到模拟器中的增量动作模型对…

next.js刷新页面时二级菜单展开状态判断

在 Next.js 中保持二级菜单刷新后展开状态的解决方案 在 Next.js 应用中,当页面刷新时保持二级菜单的展开状态,可以通过以下几种方法实现: 方法1:使用 URL 参数保存状态(推荐) import { useRouter } from n…

网络基础DAY13-NAT技术

NAT技术internet接入方式:ADLS技术:能够将不同设备的不同信号通过分离器进行打包之后再internet中传输,到另一端的分离器之后再进行分离。传输到不同的设备中去。常见光纤接入方式internet接入认证方式:PPPoE:先认证再…

HBuilderX中设置 DevEco Studio路径,但是一直提示未安装

前言: HBuilderX中设置 DevEco Studio路径,但是一直提示未安装。 报错信息: 检测到鸿蒙工具链,请在菜单“工具->设置->运行配置”中设置鸿蒙开发者工具路径为 DevEco Studio 的安装路径,请参考 报错原因…

什么是GNN?——聚合、更新与循环

在传统的深度学习中,卷积神经网络(CNN)擅长处理网格结构数据(如图像),循环神经网络(RNN)擅长处理序列数据(如文本)。但当数据以图的形式存在时(如…

深入解析 Django REST Framework 的 APIView 核心方法

在 Python 3 中,Django 的 APIView 类是 Django REST Framework(DRF)中用于构建 API 视图的核心基类。它提供了一个灵活的框架来处理 HTTP 请求,并通过一系列方法支持认证、权限检查和请求限制等功能。self.perform_authenticatio…

神经网络——卷积层

目录 卷积层介绍 Conv2d 卷积动画演示 卷积代码演示 综合代码案例 卷积层介绍 卷积层是卷积神经网络(CNN)的核心组件,它通过卷积运算提取输入数据的特征。 基本原理 卷积层通过卷积核(过滤器)在输入数据&…

神经网络——线性层

在机器学习中,线性层(Linear Layer) 是一种基础的神经网络组件,也称为全连接层(Fully Connected Layer) 或密集层(Dense Layer)。 其严格的数学定义为:对输入数据执行线…

大模型高效适配:软提示调优 Prompt Tuning

The Power of Scale for Parameter-Efficient Prompt Tuning ruatishi 软提示向量 具体是什么 《The Power of Scale for Parameter-Efficient Prompt Tuning》中增加的部分是“软提示(soft prompts)”,这是一种针对特定下游任务,添加到输入文本中的可调参数序列。它与传统…

https正向代理 GoProxy

背景: 在安全隔离的内网环境中,部署于内网的应用如需调用公网第三方接口(如支付、短信),可通过正向代理服务实现访问。 GoProxy 下载: https://github.com/snail007/goproxy/releases 使用文档&#xff…

Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践

一、字节流与字符流:如何选择? 1.1 核心区别特性字节流字符流处理单位字节(8位)字符(16位Unicode)适用场景二进制文件(图片/视频)文本文件(TXT/CSV)编码处理需…

QT6 源,七章对话框与多窗体(5) 文件对话框 QFileDialog 篇二:源码带注释

&#xff08;13&#xff09;本源代码定义于头文件 qfiledialog . h &#xff1a; #ifndef QFILEDIALOG_H #define QFILEDIALOG_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtCore/qdir.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h…

关于Ajax的学习笔记

Ajax概念&#xff1a;是一门使用了js语言&#xff0c;可以使用于Javaweb&#xff0c;实现前端代码和后端代码连结的的一种异步同步&#xff08;不需要等待服务器相应&#xff0c;就能够发送第二次请求&#xff09;的一种技术&#xff0c;它主要用于网页内容的局部刷新&#xff…

The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(三)

文章目录The Missing Semester of Your CS Education 学习笔记以及一些拓展知识Vim编辑器笔记部分程序员常用的编辑器Vim的模式Vim的普通模式Vim的插入模式Vim的可视模式Vim的替换模式Vim的命令行模式Vim的高级功能文本对象宏寄存器缓冲区标记代码折叠Vim的常用配置Vim的常用插…

PyTorch常用的简单数学运算

一、基础算术运算1. 逐元素运算a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6])# 加减乘除 a b # [5, 7, 9] a - b # [-3, -3, -3] a * b # [4, 10, 18] a / b # [0.25, 0.4, 0.5]# 幂运算、平方根 a ** 2 # [1, 4, 9] torch.sqrt(a) # [1.0, 1.414, 1.732]2. 标…

C++ Lambda 表达式详解:从基础到实战

Lambda 表达式是 C11 引入的重要特性&#xff0c;它允许我们在代码中定义匿名函数&#xff0c;极大地简化了代码编写&#xff0c;尤其是在使用 STL 算法和多线程编程时。本文将详细介绍 Lambda 表达式的语法、特性及实际应用场景。什么是 Lambda 表达式&#xff1f;Lambda 表达…