簡體   English   中英

502 Bad Gateway在Elastic Beanstalk上部署Express Generator模板

[英]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文件。 我們看到要求../mainapp.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: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.htmlhttp://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM