【问题标题】:ExpressJS - Elastic Beanstalk 502 Bad GatewayExpressJS - Elastic Beanstalk 502 错误网关
【发布时间】:2015-04-27 13:07:04
【问题描述】:

我在 Amazon Elastic Beanstalk 上运行 Express.js 应用程序并且我的环境已成功创建,但是当我通过 Amazon 创建的 URL 转到我的环境时,我收到 502 Bad Gateway nginx/1.6.2 错误。虽然我已经阅读了 StackOverflow 上的其他资源,建议我将我的主文件从 server.js 重命名为 main.js 并将 port 设置在 bin/www 文件夹中,但我觉得这不是我的应用程序的解决方案。我跑了node server.js,这是我相信的命令 Elastic Beanstalk 运行但不起作用,(错误消息):

node server.js
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: failed to connect to [undefined:27017]

因为我在 .env 文件中设置了 ENV 变量,所以我可以运行我的服务器的唯一方法是使用工头。这让我认为 502 错误是 Elastic Beanstalk 无法理解变量的结果,从而导致服务器出现故障。谁能确认我走在正确的道路上,或者这个问题真的是因为我的主文件名为 server.js 而不是在 bin/www 文件夹中?

这是我 server.js 文件中的代码:

//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser'); // configure app to use bodyParser()
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var aws = require('aws-sdk');

app.use(bodyParser.urlencoded({ extended: true})); // get data from a POST method
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cookieParser());


var port = process.env.PORT || 8080; // set the port

var DB_CONFIG = process.env.DB_CONFIGURATION;
var AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY;
var AWS_SECRET_KEY = process.env.AWS_SECRET_KEY;
var S3_BUCKET = process.env.S3_BUCKET;

var blogDB = require('./config/blogDB.js');
mongoose.connect(blogDB.url);




require('./config/passport.js')(passport);


app.set('view engine', 'ejs'); // set ejs as the view engine

app.use(express.static(__dirname + '/public')); // set the public directory

app.use(session({ secret: 'thisisatest' }));
app.use(passport.initialize());
app.use(passport.session());

app.use(flash());


var routes = require('./app/routes');

app.use(routes); // use routes.js


app.listen(port);
console.log('magic is happening on port' + port);

还有我的包文件:

{
  "name": "test",
  "main": "server.js",
  "dependencies": {
    "body-parser": "1.6.5",
    "ejs": "^1.0.0",
    "express": "^4.6.1",
    "express-paginate": "0.0.2",
    "mongoose": "~3.6.15",
    "mongoose-paginate": "^3.1.0",
    "serve-favicon": "*",
    "passport" : "~0.1.17",         
    "passport-local" : "~0.1.6",
    "connect-flash" : "~0.1.1",     
    "bcrypt-nodejs" : "latest",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.0",
    "method-override": "~1.0.0",
    "express-session": "~1.0.0",
    "aws-sdk": "*" 
  }
}

【问题讨论】:

  • 您在 nginx 代理后面运行 nodejs 应用程序?您是否设置了正确的反向代理配置?
  • @cphill:查看您的日志,部署的应用程序似乎没有得到正确的 mongoDB 路径 Error: failed to connect to [undefined:27017]。您是否尝试将 NODE_ENV 从 EBS 控制台设置为正确的值?

标签: node.js amazon-web-services express nginx amazon-elastic-beanstalk


【解决方案1】:

今晚我也遇到了同样的问题。事实证明,即使门户网站声称它将默认运行npm start,节点应用程序也没有启动。

这是我为修复它所做的:

  1. 在我的项目根目录中创建一个名为 .ebextensions 的目录
  2. 在 .ebextensions 中创建一个名为 nodecommand.config 的文件
  3. 在 nodecommand.config 中添加以下 yaml:
option_settings:
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeCommand
    value: "npm start"

完整说明可在此处获得:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html

【讨论】:

  • 这并不能解决我的问题
  • 太棒了!修复了问题
  • 您还可以使用eb logs 检查日志以了解在部署 NodeJS 应用程序时可能发生的错误。 EB 有点绕过某些错误,仍然说它“成功部署”了应用程序。
  • @GiwooGustavoLee 与日志我能够看到来自 Nginx 的错误,因为代理服务器试图将请求转发到 IP:8081。所以我将节点端口更改为 8081
【解决方案2】:

我也面临这个问题,但这是因为缺少npm module 之一。您可以在弹性 beanstalk 仪表板的日志部分中看到缺少的 npm model 名称。它在我的本地机器上运行良好,只是因为我的系统中全局安装了那个特定的 npm 模块。

【讨论】:

    【解决方案3】:

    从 EB 应用程序仪表板,转到配置 -> 软件配置 -> 将值“npm start”或“node 'yourmainfile'”添加到节点命令。

    尽管 AWS 显示“启动 Node.js 应用程序的命令。如果指定了空字符串,则使用 app.js,然后使用 server.js,然后按顺序使用“npm start””,但看起来它并没有'除非您指定,否则不会运行。

    【讨论】:

      【解决方案4】:

      对于我的情况,我正在分享对错误 502 Bad Gateway Nginx 有用的方法。

      AWS Elastic Beanstalk 使用 Nginx 作为负载平衡的代理服务器,即使您刚刚开始。

      我从 AWS EB 控制台管理中查找来自 Nginx 的错误日志。始终检查日志,因为您的错误可能与其他错误不同。

      现在假设您的 IP 是 AAA.BBB.CCC.DDD。我在错误中发现,Nginx 收到来自AAA.BBB.CCC.DDD 的请求并将其转发给AAA.BBB.CCC.DDD:8081。并且由于我在代码中启动 Node 以移植 3003,因此我不得不将其更改为生产环境或任何你称之为 AWS EB 服务器环境的环境。

      如果需要,您可以使用 ENV 来保持灵活性(ENV 可以直接添加到 EB 控制台)。将 PORT 设置为 8081 后,请确保您提交,因为 Elastic Beanstalk 遵循 GIT 规则知道要获取哪个文件,如果您不提交,它将不会部署更改。

      完成后,使用命令eb deploy 并立即观察它的工作情况。

      【讨论】:

        【解决方案5】:

        对我来说,这个错误是因为我没有在软件配置部分设置“npm start”,即使我在创建应用程序之前做了。 似乎有一些错误,我不得不再次设置它,所以请检查它是否设置!

        【讨论】:

          【解决方案6】:

          在我的情况下,问题是我的端口,我的快速服务器正在侦听端口 80。 我只需要将其更改为 8081,因为我认为 EB 反向代理(nginx/apache)默认尝试将流量重定向到 8081。

          我通过查看 AWS EB 访问日志发现了这一点。

          【讨论】:

          • 这对我有用
          【解决方案7】:

          晚上好

          根据我的经验,当您没有在正确的端口上运行 Express 时,您通常会收到此错误。

          Nginx 尝试将流量从端口 8081 路由到服务器,这可以进行负载平衡。

          因此,您应该明确确保使用端口 8081 作为您的 Express 侦听端口(例如 process.env.PORT=8081)

          谢谢

          基顿

          【讨论】:

            【解决方案8】:

            克隆后我忘记运行 npm install,sudo npm install 为我工作。

            【讨论】:

              【解决方案9】:

              确保 package.json 文件中的脚本部分如下所示:

              "scripts": {
                   //whatever other scripts
              
                   "start": "node app.js",
              
                   //whatever other scripts
              },
              

              【讨论】:

                【解决方案10】:

                请注意,NodeStart 现在被视为“旧版”:

                您可以将 Procfile 添加到源包中以指定启动应用程序的命令,如以下示例所示。此功能替换 aws:elasticbeanstalk:container:nodejs 命名空间中的旧版 NodeCommand 选项。

                同一份文件(来源如下)指出:

                当您不提供 Procfile 时,如果您提供 package.json 文件,Elastic Beanstalk 将运行 npm start。如果您也没有提供,Elastic Beanstalk 会按此顺序查找文件 app.jsserver.js,然后运行它。

                来源:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.container.html

                【讨论】:

                  【解决方案11】:
                  1. "scripts": { "start": "node app.js" } 添加到您的package.json。 如果你的主js文件不是app.js,别忘了重命名! :)

                  2. 在 Beanstalk 控制台中:配置->软件添加新环境变量:port: 8081 (PORT: 8081)

                  重要提示:即使您将环境变量添加为port,您仍然必须使用PORT(大写)。这就是解决我的问题的原因。 我尝试使用process.env.port,但它不起作用。 请改用process.env.PORT

                  const port = process.env.PORT || 3000;
                  app.listen(port, () => {
                    console.log("Server is listening on: ", port);
                  });
                  

                  【讨论】:

                    【解决方案12】:

                    在我的例子中,它是 index.js 中的 process.env.port。港口装在一个小箱子里。我修改为 process.env.PORT

                    【讨论】:

                      猜你喜欢
                      • 2022-07-01
                      • 2019-07-03
                      • 2019-07-07
                      • 2017-12-09
                      • 2015-05-04
                      • 1970-01-01
                      • 2021-09-16
                      • 2022-01-12
                      • 2019-06-12
                      相关资源
                      最近更新 更多