繁体   English   中英

ExpressJS - Elastic Beanstalk 502 错误网关

[英]ExpressJS - Elastic Beanstalk 502 Bad Gateway

我在 Amazon Elastic Beanstalk 上运行 Express.js 应用程序并且我的环境已成功创建,但是当我通过 go 到我的环境时通过 URL Amazon 已创建,我收到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);

和我的 package 文件:

{
  "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": "*" 
  }
}

我今晚遇到了同样的问题。 事实证明,尽管门户网站声称它会默认运行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 应用程序仪表板,转至配置 -> 软件配置 -> 将值“npm start”或“node 'yourmainfile'”添加到节点命令。

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

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

  2. 在 Beanstalk 控制台中:配置->软件添加新的环境变量: 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);
});

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

我通过检查 AWS EB 访问日志弄清楚了。

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

就我而言,我正在分享对错误 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并立即观察它的工作情况。

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

晚上所有

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

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

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

谢谢

基顿

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

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

"scripts": {
     //whatever other scripts

     "start": "node app.js",

     //whatever other scripts

},

请注意, 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

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

您不再需要创建 a.ebextensions 来修复此错误,只需按照以下步骤操作即可。

首先,你应该go看看你的环境抛出的日志。 (选择第一条记录,在你环境的AWS Console里一般是这样的。)然后看你扔的是什么端口,是8080还是8081,这是最常见的,弄清楚了,然后它会引导您在当前环境中进行配置,并添加一个名为 port 的环境变量,并添加出现在您正在工作的环境的日志(您最近查看的注册表)中的端口,最后在您的 main 中验证文件(index.js 或 app.js 随便什么,!)启动你的服务器的文件,你有这个const PORT = process.env.port || 5900; const PORT = process.env.port || 5900; ...最后,在您的项目的根目录中也有一个文件,如果不只是创建,那么...它被称为Procfile并在该文件中添加以下行: web: npm start ,此行的作用是启动您的bs(beanstealk) 中的应用程序,我将留下一些图像以获取更多详细信息。

第一次抓捕。 修复错误 502 的第一步

第二次抓捕。 修复错误 502 的第一步

现在,只需 go 到您的项目文件夹并执行,

  • git add. 然后做 > git commit -m "Updated or whatever"

最后运行 eb cmd ... eb deploy

如果您正在获取Nginx 502 Bad Gateway。 更改您的AWS实例Elasticbeans Talk->软件-> Nginx更改为无

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM