【问题标题】:Has anyone been successful deploying a node (express) app with Amazon OpsWorks?是否有人使用 Amazon OpsWorks 成功部署了节点(快速)应用程序?
【发布时间】:2014-12-02 06:01:19
【问题描述】:

正如标题所暗示的,我一直在尝试使用 Amazon 的新 OpsWorks 管理系统部署应用程序,但是我无法弄清楚如何让节点服务器开始在实例上运行。从应用程序层也可以访问的端口我假设我需要在端口 80 上进行侦听,但是我觉得问题在于没有启动正确的文件。

类似于 Heroku 上的 Procfile,是否需要包含一个特殊的启动脚本类型文件才能使 OpsWorks 正确启动它?

请注意,我还没有使用 Chef 的经验,所以我希望让它使用默认选项,即不编写自定义 Chef 食谱来做到这一点。

【问题讨论】:

    标签: node.js amazon-web-services


    【解决方案1】:

    我在这件事上花费的时间令人尴尬,但无论如何我都会分享,希望能挽救其他人的生命,否则他们会被亚马逊偷走。

    • 要回答您的问题,是的,我确实让我的 node/express 应用程序运行了。
    • 如果您使用任何一种process.env 方法来选择端口号,请将您的侦听端口更改为 80(或 443,如果适用)。
    • 最重要的是,亚马逊并不关心您的 main 文件是什么。将其重命名为 server.js 并将其放在应用程序的根目录中。这是 monit 尝试运行的文件。

    希望这会有所帮助。如果没有,或者所有这些都很明显,我为我的愚蠢道歉并责备睡眠不足。 :)

    【讨论】:

    • 哈哈,我也花了很长时间。是的,文件的名称是我认为的。我的是 app.js(基本的 express 命令生成的),但我不知道它必须是什么。
    • 此外:如果您在 HAProxy 层后面运行节点应用程序,请确保运行状况检查(默认情况下是 HTTP OPTIONS 请求)可以由 express 处理。我必须切换到 HEAD 请求方法才能使其工作......
    【解决方案2】:

    来自 ZachRabbit 的精彩回答。我想补充一点,OpsWorks 现在支持为已部署的应用程序进程设置环境变量(即 process.env.PORT)。

    当您添加应用程序(或编辑)时,如果您在 server.js 中使用类似以下内容,则可以继续使用 PORT 键和 80 值设置环境变量:

    !/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 对我来说就像一个冠军。

    【讨论】:

      【解决方案3】:

      只需复制 AWS OpsWorks 页面以配置 node.js 应用程序:

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

      问候。

      【讨论】:

        【解决方案4】:

        我也玩了一会儿,希望我的成功之路能对某人有所帮助。 Node.js 通常需要提升权限才能在端口 80 上运行,所以我发现虽然命名示例应用 app.js 很好,但您需要修改默认 OpsWorks Node.js 部署厨师配方的第 2 行以使用 sudo:

        【讨论】:

        • 节点确实需要提升权限才能在端口 80 作为其保留端口上运行,但 OpsWorks 似乎以实例的 root 用户身份运行所有内容。通常这真的很糟糕,因为安全问题可能会导致恶意代码以 root 身份执行(想想 Rails ......)。然而,因为 EC2 实例只是花哨的虚拟机,以 root 身份运行无论如何都不能在实例之外产生任何影响。
        • 另外,如何以 sudo 运行让文件名为 app.js 而不是 server.js?
        • 根据我的经验,OpsWorks 的默认 Node.js 层并不是专门针对 server.js,因此它使用 app.js 文件名。是的,任何应用程序都需要 root 访问权限才能在 1024 以下的端口上运行,这就是为什么不使用 sudo,我无法使用 OpsWorks 配方自动启动应用程序。
        • 嗯,你的经历似乎与我的经历直接冲突。我能够在不修改默认值的情况下侦听端口 80(正如我所说,EC2 实例将以 root 身份运行,因此不需要 sudo)。但是,在将文件名更改为 server.js 之前,我无法启动任何操作。
        • 我的经历与尼克的相似。我唯一能想到的是 Ubuntu 和 Amazon Linux 安装之间可能存在差异。你们俩都用的是哪个操作系统?我选择了 Ubuntu。
        【解决方案5】:

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

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

        希望对任何人都有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-16
          • 2019-06-14
          • 2011-05-08
          • 1970-01-01
          • 2017-08-16
          • 1970-01-01
          • 1970-01-01
          • 2022-07-20
          相关资源
          最近更新 更多