[英]Can’t gracefully shut down a node + Express app (node http server's close function does not complete)
我希望我正在開發的應用程序的基於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
功能可能無法完成嗎?
.close()
實際上並不會關閉任何活動連接,它只會停止建立新的連接,並且它將等待活動連接被客戶端關閉。
如果連接的客戶端保持連接打開(例如,使用保持活動連接),則可能永遠不會調用回調。
有一個名為http-shutdown
的軟件包,可以幫助正常關閉HTTP服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.