エクスプレスジェネレーターを使用してシンプルなエクスプレスアプリを作成しました。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);
});
明確にするために、コメントから答えを述べます。
AWS ELBはnode app.js
をnpm 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
を実行する命令があります
これは、実行される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
の名前を変更する代わりに、Elastic Beanstalk構成ファイルを作成することもできます。 .config
ファイルを.ebextensions
フォルダーに追加します(例:.ebextensions/34.config
)。名前空間aws:elasticbeanstalk:container:nodejs
のNodeCommand
設定を、サーバーを起動するために実行するコマンドに変更します。たとえば、これは.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
に設定するだけです。
実行ポートを8081に設定
app.set('port', 8081);
実際には、別のオプションがあります。
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
誰かが私がした愚かなことをした場合、エクスプレスを使用している場合は「bin」フォルダがコミットされていることを確認してください。私は「.gitignore」ファイルに私のものがあり、これが502エラーを受け取っていた理由です。
「.gitignore」から「/ bin」を削除し、コミットし、EBへの変更をデプロイします。
aWSの新機能であり、webdevedからしばらく経ちましたが、今夜同じ問題で立ち往生しました。スレッドの全員に感謝します。 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"
}
}