ExpressJS - Elastic Beanstalk 502 Bad Gateway

cph*_*ill 9 nginx amazon-web-services node.js express amazon-elastic-beanstalk

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

node server.js
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: failed to connect to [undefined:27017]
Run Code Online (Sandbox Code Playgroud)

因为我在.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);
Run Code Online (Sandbox Code Playgroud)

和我的包文件:

{
  "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": "*" 
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

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

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


Ibr*_*bra 7

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

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


Gro*_*Src 6

今晚我遇到了同样的问题.事实证明节点应用程序尚未启动,即使门户网站声称它将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"
Run Code Online (Sandbox Code Playgroud)

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

  • 您还可以使用“ eb logs”检查日志,以了解部署NodeJS应用程序时可能发生的错误。EB会绕过某些错误,但仍然说它“成功部署”了该应用程序。 (2认同)
  • @GiwooGustavoLee 与日志我能够看到来自 Nginx 作为代理服务器尝试将请求转发到“IP:8081”的错误。所以我将节点端口更改为8081 (2认同)

ale*_*ize 5

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

  2. 在 Beanstalk 控制台中:Configuration->Software 添加新的 env var: port: 8081 (PORT: 8081) 在此处输入图片说明

重要提示:即使您添加了 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);
});
Run Code Online (Sandbox Code Playgroud)