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.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 表達…