我希望应用程序的基于Express.js的服务器在发送关闭信号(SIGTERM或SIGINT)之前,在退出节点进程之前正确关闭所有连接。
我稍微修改了express-graceful-shutdown中间件(这真的很简单),因此代码的相关部分大致如下所示:
server.js
import gracefulShutdown from './tools/graceful-shutdown';
const server = app.listen(config.port, () => {
console.log(`Server is running`);
});
app.use(gracefulShutdown(server));graceful-shutdown.js:
function gracefulShutdownMiddleware(server) {
let shuttingDown = false;
const forceTimeout = 10 * 1000; // giving the app 10 seconds to shutdown gracefully
process.on('SIGTERM', gracefulExit); // listen for TERM signal (e.g. kill)
process.on ('SIGINT', gracefulExit); // listen for INT signal (e.g. Ctrl-C)
function gracefulExit() {
if (shuttingDown) return;
shuttingDown = true;
console.log('Received kill signal (SIGTERM), shutting down');
setTimeout(function () {
console.log('Could not close connections in time, forcefully shutting down');
process.exit(1);
}, forceTimeout);
server.close(function () {
console.log('Closed out remaining connections.');
process.exit();
});
}
function middleware(req, res, next) {
if (!shuttingDown) return next()
res.set('Connection', 'close')
res.status(503).send('Server is in the process of restarting.')
}
return middleware
}
export default gracefulShutdownMiddleware;我观察到的问题是这个。如果在节点服务器启动后立即关闭,它将按预期关闭(中间件中的函数gracefulExit正确工作,server.close执行良好,对server.close的回调打印出控制台消息)。但是,如果我打开浏览器并在本地主机上实际访问我的应用程序,那么服务器就有一些工作要做,然后尝试关闭服务器,那么server.close函数似乎还没有完成(所以它从未用process.exit调用回调,直到最终setTimeout调用自己的回调并强制关闭应用程序。
server.close函数是节点库中的这一功能。
您能帮我找出节点服务器的close功能可能无法完成的原因吗?
发布于 2016-10-22 20:16:57
.close()实际上并不关闭任何活动连接,它只会阻止新连接的建立,并等待活动连接(由客户端关闭)关闭。
如果连接的客户端保持连接处于打开状态(例如使用保持活动的连接),则回调可能永远不会被调用。
有一个名为http-shutdown的包,它将有助于优雅地关闭HTTP服务器。
https://stackoverflow.com/questions/40196310
复制相似问题