43

我实际上正在对 ExpressJS 服务器进行一些负载测试,我注意到服务器发送的响应包含一个“Connection: Keep-Alive”标头。据我了解,连接将保持打开状态,直到服务器或客户端发送“连接:关闭”标头。

在某些实现中,“Connection: Keep-Alive”标头带有“Keep-Alive”标头,用于设置连接超时和通过此连接发送的最大连续请求数。

例如:“保持活动:超时=15,最大值=100”

有没有办法(是否相关)在 Express 服务器上设置这些参数?

如果没有,你知道 ExpressJS 是如何处理这个问题的吗?

编辑: 经过一番调查,我发现节点标准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 级别的选项,允许您检测连接的另一端是否已消失。

4

3 回答 3

37

对于快递 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.
});
于 2012-11-20T23:28:47.917 回答
8

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

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

server.keepAliveTimeout = 30000;


于 2020-07-22T13:59:16.520 回答
3

对于 Node.js10.15.2和带有 express 的更新版本,仅server.keepAliveTimeout是不够的。我们还需要配置server.headersTimeoutserver.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
于 2021-08-25T12:11:20.887 回答