ExpressJS - Elastic Beanstalk 502 Bad Gateway

时间:2015-02-25 13:49:35

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

我正在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变量,所以我可以运行服务器的唯一方法是使用foreman。这让我觉得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": "*" 
  }
}

12 个答案:

答案 0 :(得分:6)

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

以下是我采取的措施:

  1. 在项目的根目录中创建名为.ebextensions的目录
  2. 内部.ebextensions创建名为nodecommand.config
  3. 的文件
  4. 在nodecommand.config中添加以下yaml:
  5. 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

答案 1 :(得分:3)

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

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

重要提示:即使您将 env var 添加为 port,您仍然必须使用 PORT(大写)。这就是解决我的问题的原因。 我尝试使用 process.env.port,但没有用。 改用 process.env.PORT

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

答案 2 :(得分:1)

从EB App仪表板中,转到“配置”->“软件配置”->向“节点命令”添加值“ npm start”或“ node'yourmainfile'”。

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

答案 3 :(得分:1)

请注意,NodeStart 现在被视为“遗留”:

<块引用>

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

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

<块引用>

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

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

答案 4 :(得分:0)

我也面临着这个问题,但这是因为npm model之一缺席。您可以在弹性beantalk仪表板的日志部分中看到缺少的SUBSTRING(PhoneNumberID, PATINDEX('%([0-9][0-9][0-9])[0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]%', PhoneNumberID), 13) 名称。在我的本地计算机上它运行良好,只是因为该特定的npm模块已全局安装在我的系统中。

答案 5 :(得分:0)

对于我来说,我正在分享对错误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以来,我不得不将其更改为Production或任何您称为AWS EB Server环境的东西。

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

完成后,使用命令eb deploy并观察它现在是否有效。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

就我而言,问题是我的端口,我的快递服务器正在监听端口80。 我只需要将其更改为8081,因为我认为EB反向代理(nginx / apache)会默认将流量重定向到8081。

我通过检查AWS EB访问日志发现了问题。

答案 8 :(得分:0)

晚上全部

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

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

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

谢谢

基顿

答案 9 :(得分:0)

克隆后我忘了运行npm install,sudo npm install对我有用。

答案 10 :(得分:0)

确保package.json文件中的脚本部分看起来像这样

|

},

答案 11 :(得分:-1)

如果您正在获取Nginx 502错误网关。将您的aws实例更改为Elasticbeans Talk->软件-> Nginx更改为无