![](/img/trans.png)
[英]Nodejs 502 Bad Gateway Deploying Express on Elastic Beanstalk AWS
[英]502 Bad Gateway Deploying Express Generator Template on Elastic Beanstalk
我使用快速生成器來創建一個簡單的快速應用程序,當在dev上啟動時,在localhost:3000上運行正常。
但是,當我使用eb命令--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"
我正在使用默認的nginx配置。 當我運行沒有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');
to var app = require('../main');
那它應該正常工作!
為清楚起見,這是我的目錄:
當啟動應用程序服務器時,ELB將調用package.json
文件。 這里有運行啟動腳本node bin/www
的指令
這是運行的bin/www
文件。 我們看到要求../main
和app.set('port'...)
然后運行路由的main.js
文件全部:
當我創建的項目中, main.js
文件被命名為app.js
。 引起的問題是基於優先級ELB啟動序列。 ELB將啟動應用程序並首先檢查app.js
存在 - 如果它存在,它運行node app.js
,否則它將檢查package.json
存在並嘗試運行npm start
。 當main.js
的名稱為app.js
ELB試圖通過運行它來啟動整個應用程序。 但是,此文件不會打開任何端口。
重命名app.js
的替代方法是創建彈性beanstalk配置文件。 將.config
文件添加到.ebextensions
文件夾中,例如.ebextensions/34.config
。 將名稱空間aws:elasticbeanstalk:container:nodejs
的NodeCommand
設置更改為要運行以啟動服務器的任何命令。 例如,這是運行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-options -nodejs了解更多信息。
編輯:更簡單的方法 - 使用AWS控制台,配置/軟件具有“節點命令”選項 - 只需將其設置為npm start
。
將運行端口設置為8081
app.set('port', 8081);
實際上,還有另一種選擇。
在Elastic Beanstalk控制台上,在app-environment部分內,左側有一個Configuration菜單項(右下方的Dashboard菜單選項)。 如果單擊那里,您會發現許多配置選項。 單擊“ 軟件配置” ,然后定義哪個是您的節點命令 。 它解釋了它嘗試的命令的順序:“啟動Node.js應用程序的命令。如果指定了空字符串,則使用app.js,然后使用server.js,然后按順序”npm start“
我的錯誤在於我的啟動命令腳本。 它是啟動nodemon:
"scripts": {
"start": "NODE_ENV=production && nodemon ./bin/www"
然后我改為節點,它工作:
"scripts": {
"start": "NODE_ENV=production && node ./bin/www"
希望我能幫助別人。
如果您使用端口8081運行您的快速應用程序並使用sudo運行節點服務器,您的應用程序將直接從elasticbean URL訪問,沒有端口號,否則它將顯示來自nginx的502網關錯誤。
默認情況下,Nginx代理8081端口,用於elastibeanstalk上的節點應用程序。
創建文件 - 。 ebextensions /nodecommand.config並在下面輸入選項設置 -
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeCommand: sudo pm2 start server.js (server command with sudo ie. sudo node /bin/www)
您可以為容器命令創建另一個文件 - 。 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
如果有人做了我做過的愚蠢的事情,如果你使用快遞,請確保你的'bin'文件夾已經提交。 我的'.gitignore'文件中有我的,這就是我收到502錯誤的原因。
只需從'.gitignore'中刪除'/ bin',提交,然后將部署更改為EB。
自從我加入AWS以來已經有一段時間了,但是我今晚也遇到了同樣的問題,並且感謝線程中的每個人,我很高興地說基本的socket.io教程現在像一個魅力,我只是忘了一個package.json中的行:
"scripts":
{
"start": "node app.js"
}
哦,還有港口! 我從elasticbean示例node.js應用程序中保留的唯一內容是此值而不是純3000值:
var port = process.env.PORT || 3000;
注意:我遇到了這個問題,沒有一個解決方案適合我。
我的解決方案是確保package.json中的devDependencies實際上是依賴項。
例如:
{
"name": "whaler-test",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www",
"create-db": "cd dynamodb && node createDonorsTable.js && cd ..",
"delete-db": "cd dynamodb && node deleteDonorsTable.js && cd ..",
"load-data": "cd dynamodb && node loadDonorsData.js && cd ..",
"read-data": "cd dynamodb && node readDataTest.js && cd .."
},
"dependencies": {
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"http-errors": "~1.6.2",
"jade": "~1.11.0",
"morgan": "~1.9.0",
"nodemon": "1.17.5",
"cors": "2.8.4",
"aws-sdk": "^2.270.1"
}
}
不:
{
"name": "whaler-test",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www",
"create-db": "cd dynamodb && node createDonorsTable.js && cd ..",
"delete-db": "cd dynamodb && node deleteDonorsTable.js && cd ..",
"load-data": "cd dynamodb && node loadDonorsData.js && cd ..",
"read-data": "cd dynamodb && node readDataTest.js && cd .."
},
"dependencies": {
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"http-errors": "~1.6.2",
"jade": "~1.11.0",
"morgan": "~1.9.0",
"nodemon": "1.17.5"
},
devDependencies {
"cors": "2.8.4",
"aws-sdk": "^2.270.1"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.