【问题标题】:How to set the HTTP Keep-Alive timeout in a nodejs server如何在 nodejs 服务器中设置 HTTP Keep-Alive 超时
【发布时间】:2012-09-21 00:21:24
【问题描述】:

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

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

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

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

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

编辑: 经过一番调查,我发现默认超时设置在node standard http library

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);

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

编辑2: 感谢 josh3736 的评论。

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

【问题讨论】:

  • Timeout 与 keepAliveTimeout 不同,socket.setTimeout 无法在 nodejs 服务器中设置 HTTP Keep-Alive 超时。您应该使用 server.keepAliveTimeout 并在使用 socket.setKeepAlive nodejs.org/dist/latest-v14.x/docs/api/… 的同时打开 TCP keepalive。

标签: node.js http-headers express keep-alive


【解决方案1】:

对于快递 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.
});

【讨论】:

  • 你为什么要在那里听两遍?
  • 对我不起作用,设置后超时被覆盖。不过,在 Server 对象上设置 keepAliveTimeout 确实有效。
  • @Yogu 你在哪里设置keepAliveTimeout?你能提供另一个答案吗?
  • 当问题是针对基本 node.js http 库时,为什么这个答案显示了如何为 express 执行此操作?至少也要为基本的http 模块显示这个,即使你接着说“但你可能想使用 express”(有些人真的不这样做,因为他们需要一个基本的 HTTP 服务器纯粹是为了协议升级)
  • 我很想了解这里实际发生了什么。我遇到的情况是,当我花了很长时间处理请求时,最终看起来请求在我完成原始请求处理之前被重试。
【解决方案2】:

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

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

server.keepAliveTimeout = 30000;


【讨论】:

    【解决方案3】:

    对于 Node.js 10.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2011-12-22
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多