Подтвердить что ты не робот

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);
});
4b9b3361

Ответ 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"
  }
}