有人成功地使用Amazon OpsWorks部署Node(Express)应用程序吗?

14
正如标题所示,我一直在使用亚马逊的新OpsWorks管理系统部署应用程序,但我无法弄清楚如何在实例上启动节点服务器。根据应用程序层可以访问的端口,我认为我需要在端口80上侦听,但是我觉得问题在于没有启动正确的文件。
与Heroku上的Procfile类似,是否需要包含特殊的启动脚本类型文件以使OpsWorks正常启动它?
请注意,我还没有使用Chef的经验,因此希望使用默认选项使其工作,即不编写自定义Chef配方来完成它。
5个回答

28

我在这上面花费的时间让我很尴尬,但是我仍然会分享,希望能为其他人节省时间,防止亚马逊偷走他们的生命。

  • 回答你的问题,是的,我成功运行了我的node/express应用程序。
  • 如果你使用任何形式的process.env 方法来选择端口号,请将监听端口更改为80(如果适用,则为443)。
  • 最重要的是,亚马逊不关心你的 main 文件。请将其重命名为 server.js 并放在应用程序的根目录中。那是monit尝试运行的文件。

希望这可以帮到你。如果不能或者这些都很明显,那我道歉我的糊涂并归咎于睡眠不足。 :)


哈哈,我花了太长时间在这上面了。是的,文件的名称就是我想的那个东西。我的文件名是app.js(基本的express命令生成的),但我无法弄清它应该是什么。 - Nick Mitchinson
3
此外:如果您在HAProxy层后运行您的节点应用程序,请确保健康检查(默认为HTTP OPTIONS请求)可以由express处理。我不得不切换到HEAD请求方法才能使其工作... - fbrandel

4

ZachRabbit的回答非常好。我想补充一下,OpsWorks现在支持为部署的应用程序进程设置环境变量(即process.env.PORT)。

当您添加应用程序(或进行编辑)时,您可以设置一个环境变量,其中键为PORT,值为80,如果您在server.js中使用以下代码之类的内容:

!/usr/bin/env node
var debug = require('debug')('my-app');
var app = require('app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

关于环境变量设置的更多信息,请参见此处:

http://docs.aws.amazon.com/opsworks/latest/userguide/apps-environment-vars.html

确保文件名为server.js,并将环境变量PORT设置为80,这对我非常有效。


1

我只是复制了AWS OpsWorks页面上有关配置Node.js应用程序的内容:

“默认情况下,我们希望您的Node.js应用程序侦听端口80。此外,我们传递给node的文件必须命名为“server.js”,并且应位于应用程序的根目录中。”

谢谢。


0

可能有点跑题,但我花了几个小时在这上面,所以我觉得值得分享:

在OpsWorks上设置Hapi.js服务器时,我必须确保不使用主机名localhost,而是将其设置为0.0.0.0。否则它就会默默地失败。

希望这能帮助到任何人。


0

我也曾经尝试过这个,希望我的成功之路能够帮到别人。Node.js通常需要提升的权限才能在80端口上运行,因此我发现,虽然将示例应用程序命名为app.js是可以的,但您需要修改默认OpsWorks Node.js部署chef配方的第2行以使用sudo:


Node.js需要高级权限才能在端口80上运行,因为它是一个保留端口,然而OpsWorks似乎将实例中的所有内容都作为root用户运行。通常情况下这是非常糟糕的,因为安全问题可能会导致恶意代码以root身份执行(想想Rails...)。但是由于EC2实例只是一种高级虚拟机,以root身份运行不会对实例外部产生任何影响。 - Nick Mitchinson
以及使用sudo权限运行时如何将文件名从server.js改为app.js? - Nick Mitchinson
根据我的经验,OpsWorks 的默认 Node.js 层并不特别寻找 server.js 文件,因此它可以使用 app.js 文件名。是的,任何应用程序需要 root 访问权限才能在低于 1024 的端口上运行,这就是为仅使用 sudo,我无法使用 OpsWorks 配方自动启动应用程序的原因。 - Justin Lewis
嗯,这很奇怪,因为你的经验似乎直接与我的相冲突。我能够在端口80上进行侦听而不修改默认设置(正如我所说,EC2实例将以root身份运行它们,因此不需要sudo)。然而,在我将文件名更改为server.js之前,我无法启动任何东西。 - Nick Mitchinson
我的经验与尼克的类似。我能想到的唯一可能是Ubuntu和Amazon Linux安装之间存在差异。你们两个都使用哪个操作系统?我选择了Ubuntu。 - ZachRabbit
我使用了亚马逊Linux,但这不会影响这些差异,因为两个安装都使用相同的配方。 - Nick Mitchinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接