502 Bad Gateway在Elastic Beanstalk上部署Express生成器模板

我使用了快速生成器来创build一个简单的快速应用程序,当在dev上启动时,在localhost:3000上运行良好。

当我使用eb command-git aws.push将它推送到弹性beanstalk时,我在生产服务器上得到了一个502错误。

看着日志,我得到的错误是:

2014/04/01 19:29:40 [error] 24204#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.2.178, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "macenvexp-env-hqv9ucmzev.elasticbeanstalk.com" 2014/04/01 19:29:40 [error] 24204#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.2.178, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8081/favicon.ico", host: "macenvexp-env-hqv9ucmzev.elasticbeanstalk.com" 

我正在使用默认的nginxconfiguration。 当我运行没有Express的node.js示例应用程序时,它工作正常。 以下是app.js中的快速代码:

 var express = require('express'); var http = require('http'); var path = require('path'); var favicon = require('static-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes'); var users = require('./routes/user'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(favicon()); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(app.router); app.get('/', routes.index); app.get('/users', users.list); /// catch 404 and forwarding to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); /// error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.render('error', { message: err.message, error: {} }); }); module.exports = app; 

这里是package.json文件:

 { "name": "macEnvExp", "version": "0.0.1", "private": true, "scripts": { "start": "DEBUG=macEnvExp node bin/www" }, "dependencies": { "express": "~3.4.8", "static-favicon": "~1.0.0", "morgan": "~1.0.0", "cookie-parser": "~1.0.1", "body-parser": "~1.0.0", "debug": "~0.7.4", "jade": "~1.3.0" } } 

这里是bin / www:

 #!/usr/bin/env node var debug = require('debug')('my-application'); var app = require('../app'); app.configure(function(){ app.set('port', process.env.PORT || 3000); }); console.log(app.get('port')); var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); }); 

为了清楚起见,我会从评论中说出答案。

AWS ELB在npm start之前运行node app.js node app.js不会给出错误,但不会打开任何端口。

解决的办法是简单地将app.js重命名为除server.js (即main.js )之外的任何内容,并通过在/ bin / www文件中指向bin / www来引用它: var app = require('../app'); var app = require('../main');

那么它应该工作正常!


为了清楚起见,下面是我的目录:

ELB在启动应用程序服务器时会调用package.json文件。 这里有指令来运行启动脚本node bin/www 在这里输入图像说明

这是运行的bin/www文件。 我们看到../mainapp.set('port'...) 在这里输入图像说明

然后运行路由和所有的main.js文件: 在这里输入图像说明

当我创build项目时, main.js文件被命名为main.js 这造成的问题是基于优先ELB启动序列。 ELB将启动应用程序并首先检查app.js存在 – 如果存在,则运行node app.js ,否则将检查package.json存在并尝试运行npm start 。 当main.js的名字是app.js ELB试图通过运行来启动整个应用程序。 但是这个文件不能打开任何端口。

重命名app.js的另一种方法是创build一个弹性beanstalkconfiguration文件。 将.config文件添加到.ebextensions文件夹中,例如.ebextensions/34.config 。 将名称空间aws:elasticbeanstalk:container:nodejsNodeCommand设置更改为要启动服务器的任何命令。 例如,这是一个运行npm start而不是app.js的最简单的.config文件:

 option_settings: - namespace: aws:elasticbeanstalk:container:nodejs option_name: NodeCommand value: "npm start" 

请参阅http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_custom_container.html和http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html#command-选项-nodejs了解更多信息。;

编辑:更简单的方法 – 使用AWS控制台,configuration/软件有“节点命令”选项 – 只需将其设置为npm start

其实还有另一种select。

在您的应用程序环境部分的Elastic Beanstalk控制台中,在左侧(右下angular的Dashboard菜单选项)中有一个configuration菜单项。 如果你点击那里,你会发现很多configuration选项。 单击软件configuration ,然后定义哪个是您的节点命令 。 这里解释了它尝试命令的顺序:“启动Node.js应用程序的命令,如果指定了空string,则使用app.js,然后使用server.js,然后按照”npm start“的顺序”

我的错误是在我的启动命令脚本。 它正在启动nodemon:

 "scripts": { "start": "NODE_ENV=production && nodemon ./bin/www" 

然后我改变到节点,它的工作:

 "scripts": { "start": "NODE_ENV=production && node ./bin/www" 

希望我帮助了一个人。

如果有人做了我所做的愚蠢的事情,确保你的“bin”文件夹是承诺,如果你使用快递。 我有我的'.gitignore'文件,这就是为什么我得到一个502错误。

只需从'.gitignore'中删除'/ bin',提交并将部署更改为EB。

如果您使用端口8081运行您的快速应用程序,并使用sudo来运行节点服务器,则您的应用程序将直接从elasticbean url中访问,而无需端口号,否则将显示502来自nginx的网关错误。

Nginx代理8081端口默认为elastibeanstalk上的节点应用程序。

创build文件 – 。 ebextensions /nodecommand.config并把下面的选项设置 –

 option_settings: aws:elasticbeanstalk:container:nodejs: NodeCommand: sudo pm2 start server.js (server command with sudo ie. sudo node /bin/www) 

您可以为容器命令创build另一个文件。 ebextensions /01_init.config并放置将在部署之前运行的所需命令。 例如 –

 container_commands: 01_node_v6_install: command: sudo curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - 02_install_node: command: sudo yum -y install nodejs 03_npm_install_gulp_webpack: command: sudo npm install -g gulp webpack pm2 04_npm_install: command: sudo npm install 05_webpack_run: command: sudo webpack 

将运行端口设置为8081

 app.set('port', 8081);