Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用keepalives高效关闭HTTP?_Node.js_Http - Fatal编程技术网

Node.js 使用keepalives高效关闭HTTP?

Node.js 使用keepalives高效关闭HTTP?,node.js,http,Node.js,Http,当所有连接关闭时,此Node.js服务器将在Ctrl+C上完全关闭 var http = require('http'); var app = http.createServer(function (req, res) { res.end('Hello'); }); process.on('SIGINT', function() { console.log('Closing...'); app.close(function () { console.log('Closed.

当所有连接关闭时,此Node.js服务器将在Ctrl+C上完全关闭

var http = require('http');
var app = http.createServer(function (req, res) {
  res.end('Hello');
});

process.on('SIGINT', function() {
  console.log('Closing...');
  app.close(function () {
    console.log('Closed.');
    process.exit();
  });
});

app.listen(3000);
问题是它包含了keepalive连接。如果你在Chrome中打开该应用的一个标签,然后尝试按Ctrl+C组合键,当Chrome最终释放连接时,它不会关闭大约2分钟


是否有一种干净的方法可以检测何时不再有HTTP请求,即使某些连接仍处于打开状态?

您可以使用响应时的finish事件对某些请求进行跟踪:

var reqCount = 0;

var app = http.createServer(function (req, res) {
  reqCount++;
  res.on('finish', function() { reqCount--; });
  res.end('Hello');
});
允许您在关闭服务器时检查reqCount是否为零

但是,正确的做法可能是不关心旧服务器,而只是启动一个新服务器。通常,重新启动是为了获得新代码,因此您可以启动一个新流程,而无需等待旧流程结束,也可以选择使用child_process模块让顶级脚本管理整个流程。或者甚至使用集群模块,允许您在关闭旧进程之前启动新进程,因为集群管理其子实例之间的流量平衡


到目前为止,我还没有真正测试过的一件事是,一旦server.close返回,是否可以保证安全地启动新服务器。否则,新服务器可能无法绑定。文档中有一个关于如何处理此类EADDRINUSE错误的示例。

您可以通过响应时的finish事件来破解一些请求跟踪:

var reqCount = 0;

var app = http.createServer(function (req, res) {
  reqCount++;
  res.on('finish', function() { reqCount--; });
  res.end('Hello');
});
允许您在关闭服务器时检查reqCount是否为零

但是,正确的做法可能是不关心旧服务器,而只是启动一个新服务器。通常,重新启动是为了获得新代码,因此您可以启动一个新流程,而无需等待旧流程结束,也可以选择使用child_process模块让顶级脚本管理整个流程。或者甚至使用集群模块,允许您在关闭旧进程之前启动新进程,因为集群管理其子实例之间的流量平衡


到目前为止,我还没有真正测试过的一件事是,一旦server.close返回,是否可以保证安全地启动新服务器。否则,新服务器可能无法绑定。文档中有一个关于如何处理此类EADDRINUSE错误的示例。

默认情况下没有套接字超时,这意味着连接将永远打开,直到客户端关闭为止。如果要设置超时,请使用此函数:

如果您试图关闭服务器,您根本无法关闭,因为存在活动连接,因此如果您尝试正常关闭,关闭功能将挂起。唯一的方法是设置一个超时,并在超时时终止应用程序


如果你有worker,那么就没有用process.exit杀死应用程序那么简单了,所以我制作了一个模块,它可以完全按照你的要求执行:。

默认情况下没有套接字超时,这意味着连接将永远打开,直到客户端关闭它们。如果要设置超时,请使用此函数:

如果您试图关闭服务器,您根本无法关闭,因为存在活动连接,因此如果您尝试正常关闭,关闭功能将挂起。唯一的方法是设置一个超时,并在超时时终止应用程序


如果你有工作人员,那就没有用process.exit杀死应用程序那么简单了,所以我制作了一个模块,它可以完全满足你的要求:。

你能关闭监听套接字,然后立即启动一个新服务器吗?如果我在同一个过程中启动一个新服务器,是的,它可以开始侦听并在那里接受新的连接。我希望在开始一个新的过程之前能够真正地等待过程停止,但也许这就是我坚持旧的方式。如果没有其他东西,它在开发过程中是有用的。是的,让它去吧或者可以将keepalive超时时间降低5秒。无论如何,这是一种常见的策略,至少对apache来说是这样。Node显然不同,但它不一定疯狂。另外,只要这个进程关闭了套接字,您就应该能够启动一个新进程并绑定它。您可以关闭侦听套接字,然后立即启动一个新服务器吗?如果我在同一个过程中启动一个新服务器,是的,它可以开始侦听并在那里接受新的连接。我希望在开始一个新的过程之前能够真正地等待过程停止,但也许这就是我坚持旧的方式。如果没有其他东西,它在开发过程中是有用的。是的,让它去吧或者可以将keepalive超时时间降低5秒。无论如何,这是一种常见的策略,至少对apache来说是这样。Node显然不同,但它不一定疯狂。此外,只要这个进程关闭了套接字,您就应该能够启动一个新进程并绑定它。一般来说,如果一个连接的操作失败,您是对的
嗯,那么它是开放的,你要么要暂停,要么就无限期地等待。但特别是HTTP,如果连接不再为任何进一步的HTTP请求提供服务,那么它就不再是“活动的”,并且可以在此基础上关闭。我定义了一个小型的请求计数模块,它公开了一个Express中间件,这正是我的工作。然而,我认为你的答案是正确的,因为我喜欢优雅的外表,我可能会开始使用它,特别是当我开始使用童工的时候。你是对的,一般来说,如果一个连接是开放的,那么它是开放的,你要么必须超时,要么无限期地等待。但特别是HTTP,如果连接不再为任何进一步的HTTP请求提供服务,那么它就不再是“活动的”,并且可以在此基础上关闭。我定义了一个小型的请求计数模块,它公开了一个Express中间件,这正是我的工作。然而,将您的答案标记为正确,因为我喜欢grace的外观,我很可能会开始使用它,特别是当我开始使用child workers.Oops时。您仍然有一个观点-如果您有任何其他东西,例如挂起的计时器回调,那么除了HTTP服务器之外,您还需要关闭所有这些。否则进程将不会自然退出.Oops,。您仍然有一个要点-如果您有任何其他东西,例如挂起的计时器回调,那么除了HTTP服务器之外,您还需要关闭所有这些。否则这个过程就不会自然退出。