首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法优雅地关闭节点+ Express应用程序(节点http服务器的关闭功能未完成)

无法优雅地关闭节点+ Express应用程序(节点http服务器的关闭功能未完成)
EN

Stack Overflow用户
提问于 2016-10-22 19:44:44
回答 1查看 1.9K关注 0票数 0

我希望应用程序的基于Express.js的服务器在发送关闭信号(SIGTERM或SIGINT)之前,在退出节点进程之前正确关闭所有连接。

我稍微修改了express-graceful-shutdown中间件(这真的很简单),因此代码的相关部分大致如下所示:

server.js

代码语言:javascript
复制
import gracefulShutdown from './tools/graceful-shutdown';

const server = app.listen(config.port, () => {
  console.log(`Server is running`);
});

app.use(gracefulShutdown(server));

graceful-shutdown.js:

代码语言:javascript
复制
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功能可能无法完成的原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-22 20:16:57

.close()实际上并不关闭任何活动连接,它只会阻止新连接的建立,并等待活动连接(由客户端关闭)关闭。

如果连接的客户端保持连接处于打开状态(例如使用保持活动的连接),则回调可能永远不会被调用。

有一个名为http-shutdown的包,它将有助于优雅地关闭HTTP服务器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40196310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档