如何在nodejs服务器中设置HTTP Keep-Alive超时时间

49

我正在对一个ExpressJS服务器进行负载测试,并注意到服务器发送的响应包括一个"Connection: Keep-Alive"头。据我所知,连接将保持打开状态,直到服务器或客户端发送一个"Connection: Close"头。

在一些实现中,“Connection: Keep-Alive”头会与“Keep-Alive”头一起出现,设置连接超时和通过该连接发送的最大连续请求数。

例如:"Keep-Alive: timeout=15, max=100"

在Express服务器上是否有设置这些参数的方法(以及是否相关)?

如果没有,您知道ExpressJS如何处理吗?

编辑: 经过一些调查,我发现默认的超时时间是在node标准http库中设置的:

socket.setTimeout(2 * 60 * 1000); // 2 minute timeout
为了改变这个:
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end("Hello World");
}).on('connection', function(socket) {
  socket.setTimeout(10000);
}).listen(3000);

无论如何,我仍然觉得服务器没有向客户端发送任何有关其超时的提示有点奇怪。

Edit2: 感谢josh3736的评论。

setSocketKeepAlive与HTTP keep-alive无关。它是一个TCP级别的选项,允许您检测连接的另一端是否消失。


超时时间与保持连接超时时间不同,socket.setTimeout 无法在 Node.js 服务器中设置 HTTP Keep-Alive 超时时间。您应该使用 server.keepAliveTimeout,并同时打开 TCP keepalive 并使用 socket.setKeepAlive。请参考 https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_server_keepalivetimeout。 - Clocher Zhong
3个回答

38

对于 Express 3:

var express = require('express');
var app = express();
var server = app.listen(5001);

server.on('connection', function(socket) {
  console.log("A new connection was made by a client.");
  socket.setTimeout(30 * 1000); 
  // 30 second timeout. Change this as you see fit.
});

你为什么在那里听两次? - gtato
对我来说不起作用,设置超时后被覆盖了。但在服务器对象上设置 keepAliveTimeout 确实有效。 - Yogu
@Yogu,你在哪里设置'keepAliveTimeout'?你能提供另一个答案吗? - Pasupathi Rajamanickam
4
为什么这个答案展示了如何在express中实现,而问题是针对基础的node.js http库的?至少也应该展示如何在基础的http模块中实现,即使你接着说“但你可能想使用express”(因为有些人需要一个基本的HTTP服务器纯粹用于协议升级)。 - Mike 'Pomax' Kamermans
这与 app.request.setTimeout(30*1000); 不同吗? - bvdb
显示剩余2条评论

14

要在 Express 服务器上设置 keepAliveTimeout,请执行以下操作:

var express = require('express');
var app = express();
var server = app.listen(5001);

server.keepAliveTimeout = 30000;



12
针对 Node.js 的版本号为 10.15.2 及更高版本,使用 express 框架时,仅配置 server.keepAliveTimeout 是不够的。我们还需要将 server.headersTimeout 配置为比 server.keepAliveTimeout 更长的时间。
server.keepAliveTimeout = 30000; 
// Ensure all inactive connections are terminated by the ALB, by setting this a few seconds higher than the ALB idle timeout
server.headersTimeout = 31000; 
// Ensure the headersTimeout is set higher than the keepAliveTimeout due to this nodejs regression bug: https://github.com/nodejs/node/issues/27363

更新

自从这个问题 与保持连接的回归问题 被关闭后,我们可以在最新的node.js版本中设置keepAliveTimeout


另外,如果你的node.js服务器部署在AWS ELB下,并且偶尔遇到502错误代码,请注意以下细节。

Clients -> AWS ELB -> Node Server

AWS ELB 默认的连接闲置超时时间为60秒,参考 文档

我们建议您将应用程序的空闲超时时间配置为大于负载均衡器配置的空闲超时时间

keepAliveTimeout 的值配置为大于60秒可以消除此问题。


1
此问题现已得到解决。 - Christian Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接