502 Bad Gateway Развертывание шаблона экспресс-генератора на эластичном бобовом стебле
Я использовал экспресс-генератор для создания простого экспресс-приложения, которое при запуске на dev работает нормально на localhost: 3000.
Когда я подталкиваю это к эластичному beanstalk, используя команду eb - git aws.push, однако, я получаю ошибку 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 по умолчанию. Когда я запускаю приложение node.js sample без Express, он работает нормально. Здесь экспресс-код в 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);
});
Ответы
Ответ 1
Для ясности я изложу ответ из комментариев.
AWS ELB работает node app.js
ПЕРЕД npm start
. node app.js
не дает ошибки, но он не открывает никаких портов.
Решение состоит в том, чтобы просто переименовать app.js
на все, кроме server.js
(т.е. main.js
), и ссылаться на это в bin/www, указав на него в файле /bin/www: var app = require('../app');
до var app = require('../main');
Тогда он должен работать правильно!
Для ясности, вот как выглядит мой каталог:
Файл package.json
будет вызываться ELB при запуске сервера приложений. Здесь он имеет инструкцию для запуска запуска script node bin/www
![enter image description here]()
Это файл bin/www
, который запускается. Мы видим, что требуется ../main
и app.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 попытался запустить все приложение, запустив его. Однако этот файл не открывает никаких портов.
Ответ 2
Альтернативой переименованию app.js
является создание файла конфигурации эластичного beanstalk. Добавьте файл .config
в папку .ebextensions
, например, .ebextensions/34.config
. Измените параметр NodeCommand
в пространстве имен aws:elasticbeanstalk:container:nodejs
на любую команду, которую вы хотите запустить, чтобы запустить сервер. Например, это минимальный .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" - просто установите значение npm start
.
Ответ 3
Установите рабочий порт на 8081
app.set('port', 8081);
Ответ 4
На самом деле есть еще один вариант.
На консоли Elastic Beanstalk внутри раздела app-environment на левой стороне находится пункт меню Конфигурация (в правой части меню Dashboard). Если вы нажмете там, вы найдете множество опций конфигурации. Нажмите Конфигурация программного обеспечения, а затем укажите, какая ваша команда node. Объясните порядок команд, которые он действительно пытается: "Команда для запуска приложения Node.js. Если указана пустая строка, используется app.js, тогда server.js, затем" npm start "в этом порядке"
Моя ошибка была в моей команде запуска script. Он начинал nodemon:
"scripts": {
"start": "NODE_ENV=production && nodemon ./bin/www"
Затем я перешел на node, и он работал:
"scripts": {
"start": "NODE_ENV=production && node ./bin/www"
Надеюсь, я помог кому-то.
Ответ 5
Если вы используете порт 8081
для запуска вашего экспресс-приложения и используете sudo
для запуска сервера узлов, доступ к вашему приложению будет осуществляться напрямую с URL-адреса эластичного боба без номеров портов, в противном случае на nginx будет отображаться ошибка 502 Gateway.
Nginx proxying 8081 port by default for node app on 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
Ответ 6
В случае, если кто-то сделал глупость, которую я сделал, убедитесь, что ваша папка bin
зафиксирована, если вы используете экспресс. У меня был мой файл .gitignore
, и именно поэтому я получил ошибку 502.
Просто удалите /bin
из .gitignore
, подтвердите изменения и внесите изменения в EB.
Ответ 7
Я новичок в AWS, и некоторое время назад я был в сети, но застрял сегодня вечером над тем же вопросом, и благодаря всем в цепочке, я очень рад сказать, что базовый урок по socket.io теперь работает как чудо, я просто забыл один строка в package.json:
"scripts":
{
"start": "node app.js"
}
о, и порт!
единственное, что я сохранил в приложении samplebean sample node.js, - это значение вместо чистого значения 3000:
var port = process.env.PORT || 3000;
Ответ 8
Примечание. Я столкнулся с этой проблемой, и ни одно из решений не помогло мне.
Мое решение состояло в том, чтобы убедиться, что devDependencies в package.json действительно находятся в зависимостях.
Например:
{
"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"
}
}