21

我已经用谷歌搜索了这个问题一段时间,但找不到答案。我的问题是在 aws elastic-beanstalk 服务器上部署 nodejs 应用程序时,如果应用程序崩溃,我希望 nodejs 应用程序会自动重新启动。

实际上很少有nodejs包已经通过命令行支持这个,比如forever,但是从控制台管理或者awscli没有简单的方法来安装这个包并执行它来实现自动重启。

我想知道您如何解决aws eb上的重启问题?

4

6 回答 6

33

我已经确认(截至 2015 年 3 月 11 日)EB 确实为您重启了节点。

为了确认,我在我的应用程序中添加了一个隐藏的查询参数:

if (req.query.testcrash == 'true') {
    setTimeout(function(){
        undefined.crashMe();
    }, 100);
}

然后在日志中验证发生了异常,并且我的应用程序已重新启动。

以供参考:

  • 我的 EB/EC2 配置是“运行 Node.js 的 64 位 Amazon Linux 2014.09 v1.0.9”
  • 使用 nginx 和节点 0.10.31
于 2015-03-11T12:10:48.570 回答
9

永远添加到您的 package.json 以便它自动安装。然后在 EB 控制台中,在配置下,自定义节点命令:

node_modules/.bin/forever app.js
于 2013-12-23T16:04:17.957 回答
3

是的,使用 Supervisor 的更好选择,但是为了能够在 aws 控制台或 beanstalk cli 工具的帮助下重新启动应用程序服务器,您需要将自己的处理程序放入目录中的 Elastic beanstalk 挂钩:/opt/elasticbeanstalk/hooks/restartappserver/ enact Hook 是放置在上述目录中的 shell、python 或 ruby​​ 脚本。将 supervisord 重新启动的逻辑放在这里,您将能够在管理控制台、aws cli 工具的帮助下重新启动它(http://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/restart-app-server .html),弹性beantalk api:(http://docs.aws.amazon.com/elasticbeanstalk/latest/APIReference/API_RestartAppServer.html

如何添加钩子,安装supervisiord等你可以在这里阅读:http: //docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

于 2013-11-07T14:28:02.180 回答
2

在玩了这个之后,并在运行后立即检查进程

aws elasticbeanstalk restart-app-server --environment-name my-env

来自@Human Love 的评论。我发现这两个命令用于在 ssh 进入 EC2 时手动启动/停止进程。不确定是否推荐这些,但为了快速调试,我发现它们很有用

# to start the process
python /opt/elasticbeanstalk/containerfiles/ebnode.py --action start-all
# to stop the process
sudo python /opt/elasticbeanstalk/containerfiles/ebnode.py --action stop-all

[注意]:这是一个 nodejs 特定的解决方案。尽管其他应用程序类型可能非常相似。检查确切的命令。打开两个终端窗口和

  1. 首先,运行aws elasticbeanstalk restart-app-server --environment-name my-env
  2. 在第二个中,运行ps aux | grep python(我 grepped 节点,因为它是一个节点应用程序)

找到特定的/opt/elasticbeanstalk脚本

于 2018-05-02T19:45:50.100 回答
1

如果要从 cron 重新启动服务器,则可以使用这些命令。

aws elasticbeanstalk restart-app-server --environment-name my-env

参考

于 2016-01-06T08:45:16.353 回答
0

是的,它确实。我知道是因为在进入盒子后我做了:

sudo pkill node

然后我可以验证:

  1. 该应用程序继续在浏览器中运行
  2. 它通过以下方式打印重新启动到可见的日志:sudo tail /var/log/web.stdout.log -f
  3. 具有新进程 ID 的新节点进程通过以下方式可见:pgrep node
于 2020-05-07T16:28:28.730 回答