我有一个包含一个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?