簡體   English   中英

無法正常關閉節點+ Express應用程序(節點http服務器的關閉功能未完成)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM