我如何关机Node.js的HTTP(S)服务器立即?(How do I shutdown a Nod

2019-07-19 02:05发布

我有一个包含一个HTTP(S)服务器的Node.js应用程式。

在特定情况下,我需要关闭该服务器程序。 什么我目前做的是调用它close()函数,但是这并没有帮助,因为它等待任何更让连接完成第一。

所以,基本上,这个停机的服务器,但只有120秒的最短等待时间之后。 但我想马上服务器关机 - 即使这意味着打破了目前处理的请求。

我不能做的是一个简单的

process.exit();

作为服务器仅仅是应用程序的一部分,而应用程序的其余部分应保持运行。 我所寻找的概念是一些诸如server.destroy(); 或类似的东西。

我怎么能做到这一点?

PS:用于连接的保持活动超时通常需要,因此它是不降低这个时候一个可行的选择。

Answer 1:

诀窍在于,你需要订阅服务器的connection ,让你的新连接的插座事件。 你需要记住这个插座,后来,有所谓的后直接server.close()销毁,使用插座socket.destroy()

此外,你需要听套接字的close事件,如果它,因为它保持活动超时没有用完自然叶从数组中删除。

我已经写了,你可以用它来证明此行为的小示例应用程序:

// Create a new server on port 4000
var http = require('http');
var server = http.createServer(function (req, res) {
  res.end('Hello world!');
}).listen(4000);

// Maintain a hash of all connected sockets
var sockets = {}, nextSocketId = 0;
server.on('connection', function (socket) {
  // Add a newly connected socket
  var socketId = nextSocketId++;
  sockets[socketId] = socket;
  console.log('socket', socketId, 'opened');

  // Remove the socket when it closes
  socket.on('close', function () {
    console.log('socket', socketId, 'closed');
    delete sockets[socketId];
  });

  // Extend socket lifetime for demo purposes
  socket.setTimeout(4000);
});

// Count down from 10 seconds
(function countDown (counter) {
  console.log(counter);
  if (counter > 0)
    return setTimeout(countDown, 1000, counter - 1);

  // Close the server
  server.close(function () { console.log('Server closed!'); });
  // Destroy all open sockets
  for (var socketId in sockets) {
    console.log('socket', socketId, 'destroyed');
    sockets[socketId].destroy();
  }
})(10);

基本上,它的作用是开始一个新的HTTP服务器,数从10到0,并在10秒后关闭服务器。 如果没有连接已经建立,服务器立即关闭。

如果连接已经建立,它仍然是开放的,它被摧毁。 如果已经自然死亡,只有一个消息在那个时间点打印出来。



Answer 2:

我发现了一个办法做到这一点,而不必跟踪连接或不必强迫他们关闭。 我不知道它是跨节点版本如何可靠或者有这个任何负面影响,但它似乎工作的我在做什么完美的罚款。 诀窍是使用发出“关闭”事件setImmediate调用后立即close方法。 这就像这样:

server.close(callback);
setImmediate(function(){server.emit('close')});

至少对我来说,这最终释放的端口,这样我就可以开始通过调用回调的时间(这是几乎瞬间)一个新的HTTP(S)服务。 现有连接保持开放。 我用这个来续订让我们的加密证书后自动重新启动HTTPS服务。



Answer 3:

如果你需要保持过程活着关闭服务器后,再戈洛罗登的解决方案可能是最好的。

但是,如果你要关闭服务器的过程中正常关机的一部分,你只需要这样的:

var server = require('http').createServer(myFancyServerLogic);

server.on('connection', function (socket) {socket.unref();});
server.listen(80);

function myFancyServerLogic(req, res) {
    req.connection.ref();

    res.end('Hello World!', function () {
        req.connection.unref();
    });
}

基本上,你的服务器用途将只保留过程活着,而他们实际上是服务请求的插槽中。 虽然他们只是坐在那里无所事事地(因为保持活动连接的),调用server.close()将关闭的过程中,只要有什么别的饲养过程活着。 如果您需要在服务器关闭后,为您的正常关机的一部分,做其他的事情,你可以挂接到process.on('beforeExit', callback)来完成您的正常关机程序。



Answer 4:

所述https://github.com/isaacs/server-destroy库提供了一种简单的方法来destroy()与所述问题所期望的行为的服务器(通过跟踪打开的连接和销毁它们中的每对服务器破坏,如在其它描述的答案)。



Answer 5:

正如其他人所说,该解决方案来跟踪所有打开的插座和手动关闭它们。 我的节点包killable能为你做到这一点。 一个例子(使用快递,但你可以调用任何使用killable http.server实例):

var killable = require('killable');

var app = require('express')();
var server;

app.route('/', function (req, res, next) {
  res.send('Server is going down NOW!');

  server.kill(function () {
    //the server is down when this is called. That won't take long.
  });
});

var server = app.listen(8080);
killable(server);


Answer 6:

另一个包的NodeJS执行关机杀人连接: HTTP关机 ,这似乎有理由保持在写这篇文章时(9月2016),并为我工作的NodeJS上6.x的

从文档

用法

目前使用这个库两种方式。 首先是服务器对象的明确的包装:

// Create the http server
var server = require('http').createServer(function(req, res) {
  res.end('Good job!');
});

// Wrap the server object with additional functionality.
// This should be done immediately after server construction, or before you start listening.
// Additional functionailiy needs to be added for http server events to properly shutdown.
server = require('http-shutdown')(server);

// Listen on a port and start taking requests.
server.listen(3000);

// Sometime later... shutdown the server.
server.shutdown(function() {
  console.log('Everything is cleanly shutdown.');
});

二是隐含加样机功能服务器对象:

// .extend adds a .withShutdown prototype method to the Server object
require('http-shutdown').extend();

var server = require('http').createServer(function(req, res) {
  res.end('God job!');
}).withShutdown(); // <-- Easy to chain. Returns the Server object

// Sometime later, shutdown the server.
server.shutdown(function() {
  console.log('Everything is cleanly shutdown.');
});


Answer 7:

我最好的猜测是手工杀掉连接(即强行关闭它的插座)。

理想情况下,这应该通过挖掘到服务器的内部和手工关闭它的插座来实现。 或者,可以运行一个壳命令,做同样的(提供的服务器具有适当的特权&C。)



Answer 8:

 const Koa = require('koa') const app = new Koa() let keepAlive = true app.use(async (ctx) => { let url = ctx.request.url // destroy socket if (keepAlive === false) { ctx.response.set('Connection', 'close') } switch (url) { case '/restart': ctx.body = 'success' process.send('restart') break; default: ctx.body = 'world-----' + Date.now() } }) const server = app.listen(9011) process.on('message', (data, sendHandle) => { if (data == 'stop') { keepAlive = false server.close(); } }) 



Answer 9:

process.exit(代码); //对于成功代码0和1用于故障



文章来源: How do I shutdown a Node.js http(s) server immediately?