处理信号以在 Elastic Beanstalk 上使用 nodejs 应用程序优雅退出?

Posted

技术标签:

【中文标题】处理信号以在 Elastic Beanstalk 上使用 nodejs 应用程序优雅退出?【英文标题】:Process signals to do a graceful exit with a nodejs app on Elastic Beanstalk? 【发布时间】:2016-04-16 01:52:17 【问题描述】:

我有这个在 Elastic Beanstalk 中运行的 Nodejs 应用程序。我想在应用程序退出时进行一些清理(例如部署新版本,重新启动应用程序服务器)。为此,我正在收听一些事件和信号,但似乎都没有被触发。以下是 app.js 中的代码:

process.on("SIGTERM", function() 
  console.log("SIGTERM, clean");
  process.exit(0);
);

process.on("exit", function(code) 
  console.log("Process exiting with code " + code);
);

process.on("uncaughtException", function() 
  console.log("Unhandled exception occurred);
  process.exit(99);
);

当我通过管理控制台重新启动应用程序时,我在日志中看不到任何内容,即使创建了一个新的节点进程并杀死了旧的节点进程。 如果我手动终止进程,我可以在输出中看到日志消息。这是否意味着 Beanstalk 触发的事件不会发送终止信号?如果是这样,怎么可能做一些优雅的退出?

编辑:这是更多调查的结果。 Beanstalk 使用 Upstart 来管理应用程序。在 /etc/init/nodejs 中有这样一行:

exec su -s /bin/sh -c 'PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1' nodejs >> /var/log/nodejs/nodejs.log

运行npm start,它使用package.json 配置启动应用程序。这是我拥有的进程树:

root     29155  su -s /bin/sh -c PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1 nodejs
nodejs   29156   \_ sh -c PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1
nodejs   29157    \_ npm                                                                                                                             
nodejs   29168     \_ node app/app.js

initctl status nodejs 显示第一个进程的 pid。所以我猜Upstart会向这个进程发送一个SIGTERM,它不会一直转发到我的进程。不幸的是,我仍然不知道如何解决这个问题。

【问题讨论】:

这有什么更新吗?你找到办法了吗? @clay:不,AWS 支持没有更新,我也没有解决方案。尝试过@pcothenet 提出的替代方法吗? 感谢您的回复。我可能不得不尝试那个“未记录且不受支持”的脚本。 . .只希望有更好的方法!我希望 Node beanstalk 会在这方面有更新,但我认为很多焦点都集中在 Docker beanstalk 上,并且可能存在类似的选项。彻底关闭服务器应该很重要! 看起来这仍然是今天的状态,有没有人更好地理解这是为什么? 【参考方案1】:

不幸的是,AWS 支持人员确认目前没有解决方法。已为 Beanstalk 开发团队创建了一个功能请求,但谁知道何时实现。

【讨论】:

【参考方案2】:

似乎有一种未记录的方式可以通过向hooks/appdeploy 文件夹添加脚本来“拦截” SIGKILL:

https://forums.aws.amazon.com/thread.jspa?messageID=493887

这几乎没有文档记录,并且 AWS 支持不支持我指出这一点。

【讨论】:

以上是关于处理信号以在 Elastic Beanstalk 上使用 nodejs 应用程序优雅退出?的主要内容,如果未能解决你的问题,请参考以下文章

在 Amazon Elastic Beanstalk 上安装 Anaconda 以在 Django 应用程序中使用

配置应用程序负载均衡器以在 Elastic beanstalk 中将 http 路由到 https

如何使用 Cloudfront 设置 AWS Elastic Beanstalk 以在 PHP 堆栈上托管图像和视频

如何重新启动 httpd 以在 Elastic Beanstalk 中的 EC2 实例上启用 HTTPS?

在哪里/如何编辑 nginx.conf 以在 Elastic Beanstalk 上启用带有附加标头的 SSL

解决与 urllib3 冲突以在 Macos 上使用 anaconda 安装 AWS elastic beanstalk CLI?