web-dev-qa-db-ja.com

502 Bad GatewayがElastic BeanstalkにExpress Generatorテンプレートをデプロイしている

エクスプレスジェネレーターを使用してシンプルなエクスプレスアプリを作成しました。devで起動すると、localhost:3000で正常に動作します。

しかし、ebコマンドでgit aws.Pushを使用してこれをElastic 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);
});
56
user3486588

明確にするために、コメントから答えを述べます。

AWS ELBはnode app.jsnpm startの前に実行します。 node app.jsはエラーを返しませんが、ポートを開きません。

解決策は、単にapp.jsの名前をserver.js以外の名前(つまりmain.js)に変更し、/ bin/wwwファイルでそれを指すことでbin/wwwを参照することです:var app = require('../app'); to var app = require('../main');

その後、正常に動作するはずです!


明確にするために、ここに私のディレクトリがどのように見えるかを示します:

package.jsonファイルは、アプリケーションサーバーの起動時にELBによって呼び出されます。ここには、開始スクリプトnode bin/wwwを実行する命令があります enter image description here

これは、実行されるbin/wwwファイルです。 ../mainapp.set('port'...)への要求を確認します enter image description here

次に、ルーティングとすべてを実行するmain.jsファイル: enter image description here

プロジェクトを作成したとき、main.jsファイルの名前はapp.jsでした。これが引き起こした問題は、優先ELB開始シーケンスに基づいていました。 ELBはアプリケーションを起動し、最初にapp.jsが存在するかどうかを確認します。存在する場合はnode app.jsを実行し、そうでない場合はpackage.jsonが存在するかどうかを確認し、npm startを実行します。 main.jsの名前がapp.jsの場合、ELBはそれを実行してアプリケーション全体を起動しようとしました。ただし、このファイルはポートを開きません。

86
Federico

app.jsの名前を変更する代わりに、Elastic Beanstalk構成ファイルを作成することもできます。 .configファイルを.ebextensionsフォルダーに追加します(例:.ebextensions/34.config)。名前空間aws:elasticbeanstalk:container:nodejsNodeCommand設定を、サーバーを起動するために実行するコマンドに変更します。たとえば、これは.configの代わりにnpm startを実行するための最小限のapp.jsファイルです。

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コンソールを使用して、Configuration/Softwareには「Node command」オプションがあります-それをnpm startに設定するだけです。

27
Logan Pickup

実行ポートを8081に設定

app.set('port', 8081);
4
Can

実際には、別のオプションがあります。

Elastic Beanstalkコンソールのapp-environmentセクションには、左側にConfigurationメニュー項目があります(右下の[ダッシュボード]メニューオプション)。そこをクリックすると、多くの構成オプションが表示されます。 ソフトウェア構成をクリックし、次にnodeコマンドを定義します。実際に試行するコマンドの順序について説明します。「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からアプリケーションに直接アクセスします。そうしないと、502ゲートウェイが表示されます。 nginxからのエラー。

Elastibeanstalk上のノードアプリのデフォルトで8081ポートをプロキシするNginx。

ファイルを作成します-.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
3
maniyadv

誰かが私がした愚かなことをした場合、エクスプレスを使用している場合は「bin」フォルダがコミットされていることを確認してください。私は「.gitignore」ファイルに私のものがあり、これが502エラーを受け取っていた理由です。

「.gitignore」から「/ bin」を削除し、コミットし、EBへの変更をデプロイします。

2
Gaz_Edge

aWSの新機能であり、webdevedからしばらく経ちましたが、今夜同じ問題で立ち往生しました。スレッドの全員に感謝します。 package.jsonの行:

"scripts":
{
"start": "node app.js"
}

ああ、そしてポート! elasticbeanサンプルnode.jsアプリから保持している唯一のものは、純粋な3000値ではなく、この値です。

var port = process.env.PORT || 3000;
1
khalil

注:私はこの問題にぶつかりましたが、解決策はありませんでした。

私の解決策は、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"
  }
}
0
Luis Pedraza