ExpressJS - Эластичный бобовый стебель 502 Bad Gateway

Я использую приложение Express.js на Amazon Elastic Beanstalk, и моя среда была успешно создана, но когда я захожу в свою среду через URL-адрес, созданный Amazon, я получаю 502 Bad Gateway nginx/1.6.2 ошибка. В то время как я читал другие ресурсы о Stack ru, которые предлагают мне переименовать мой основной файл из server.js в main.js и установить port в bin/www я чувствую, что это не решение для моего приложения. Я побежал node server.jsЯ считаю, что это команда Elastic Beanstalk, и она не работает, (сообщение об ошибке):

node server.js
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: failed to connect to [undefined:27017]

потому что у меня есть переменные ENV, установленные в .env файл, так что мой сервер работает только с мастером. Это заставило меня подумать, что ошибка 502 является результатом того, что Elastic Beanstalk не может понять переменную и, таким образом, вызвать сбой сервера. Может кто-нибудь подтвердить, что я нахожусь на правильном пути, или это действительно проблема, потому что мой основной файл называется server.js а не в bin/www папка?

Вот мой код из моего server.js файл:

//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser'); // configure app to use bodyParser()
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var aws = require('aws-sdk');

app.use(bodyParser.urlencoded({ extended: true})); // get data from a POST method
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(cookieParser());


var port = process.env.PORT || 8080; // set the port

var DB_CONFIG = process.env.DB_CONFIGURATION;
var AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY;
var AWS_SECRET_KEY = process.env.AWS_SECRET_KEY;
var S3_BUCKET = process.env.S3_BUCKET;

var blogDB = require('./config/blogDB.js');
mongoose.connect(blogDB.url);




require('./config/passport.js')(passport);


app.set('view engine', 'ejs'); // set ejs as the view engine

app.use(express.static(__dirname + '/public')); // set the public directory

app.use(session({ secret: 'thisisatest' }));
app.use(passport.initialize());
app.use(passport.session());

app.use(flash());


var routes = require('./app/routes');

app.use(routes); // use routes.js


app.listen(port);
console.log('magic is happening on port' + port);

и мой файл пакета:

{
  "name": "test",
  "main": "server.js",
  "dependencies": {
    "body-parser": "1.6.5",
    "ejs": "^1.0.0",
    "express": "^4.6.1",
    "express-paginate": "0.0.2",
    "mongoose": "~3.6.15",
    "mongoose-paginate": "^3.1.0",
    "serve-favicon": "*",
    "passport" : "~0.1.17",         
    "passport-local" : "~0.1.6",
    "connect-flash" : "~0.1.1",     
    "bcrypt-nodejs" : "latest",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.0",
    "method-override": "~1.0.0",
    "express-session": "~1.0.0",
    "aws-sdk": "*" 
  }
}

16 ответов

Решение

У меня была такая же проблема сегодня вечером. Оказалось, что приложение узла не было запущено, хотя портал утверждает, что оно будет работать npm start по умолчанию.

Вот что я сделал, чтобы это исправить:

  1. Создайте каталог с именем.ebextensions в корне моего проекта
  2. Внутри.ebextensions создайте файл с именем nodecommand.config
  3. Внутри nodecommand.config добавьте следующий yaml:
option_settings:
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeCommand
    value: "npm start"

Полные инструкции доступны здесь: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html

  1. Добавлять "scripts": { "start": "node app.js" } на ваш package.json. Если ваш основной файл js не app.js, не забудьте его переименовать! :)

  2. В консоли Beanstalk: Конфигурация-> Программное обеспечение добавьте новую переменную env: port: 8081 (PORT: 8081)

Важно: даже если вы добавите env var как port тебе все еще нужно использовать PORT(верхний регистр). Вот что решило мою проблему. Я пытался использовать process.env.port, но это не сработало. Использовать process.env.PORT вместо.

      const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log("Server is listening on: ", port);
});

На панели инструментов приложения EB выберите "Конфигурация" -> "Конфигурация программного обеспечения" -> добавьте значение "npm start" или "node 'yourmainfile'" в команду узла.

Несмотря на то, что AWS показывает "Команда для запуска приложения Node.js. Если указана пустая строка, используется app.js, затем server.js, затем" npm start "в этом порядке", похоже, что он не запускается если вы не укажете.

В моем случае проблема заключалась в моем порте, мой экспресс-сервер прослушивал порт 80. Мне просто нужно было изменить его на 8081, потому что я думаю, что обратный прокси EB (nginx/apache) пытается перенаправить трафик на 8081 по умолчанию.

Я понял это, проверив журналы доступа AWS EB.

В моем случае это был process.env. portв index.js. Порт был в маленьком футляре. Я изменил его на process.env. PORT

В моем случае я делюсь тем, что у меня сработало для ошибки 502 Bad Gateway Nginx.

AWS Elastic Beanstalk использует Nginx в качестве прокси-сервера для балансировки нагрузки, даже если вы только начали.

Я перешел из управления консолью AWS EB в поисках журналов ошибок от Nginx. Всегда проверяйте журнал, потому что ваша ошибка может отличаться от других.

Теперь предположим, что ваш IP AAA.BBB.CCC.DDD. Я обнаружил в ошибке, что Nginx получил запросы отAAA.BBB.CCC.DDD и переслать его AAA.BBB.CCC.DDD:8081. И с тех пор, как я начал портировать Node3003 в моем коде, поэтому мне пришлось изменить его на рабочую среду или как вы там называете среду AWS EB Server.

Вы можете сделать это с помощью ENV, чтобы сохранить гибкость, если хотите (ENV можно добавить непосредственно в консоль EB). Как только вы поместите ПОРТ в8081, убедитесь, что вы зафиксировали, потому что Elastic Beanstalk следует правилам GIT, чтобы знать, какой файл взять, если вы не зафиксируете, он не развернет изменение.

Как только вы закончите, используйте команду eb deploy и посмотрите, как это работает сейчас.

Вечер всем

По моему опыту, вы обычно получаете эту ошибку, если не используете Express на правильном порту.

Nginx пытается перенаправить трафик с порта 8081 на сервер, который может быть сбалансирован по нагрузке.

Таким образом, вы должны явно убедиться, что используете порт 8081 в качестве порта прослушивания Express (например, process.env.PORT=8081)

Спасибо

Китон

Убедитесь, что раздел скриптов в вашем файле package.json выглядит следующим образом

"scripts": {
     //whatever other scripts

     "start": "node app.js",

     //whatever other scripts

},

Для меня ошибка заключалась в том, что я не установил "npm start" в разделе конфигурации программного обеспечения, хотя я это сделал до создания приложения. Кажется, произошла какая-то ошибка, и мне пришлось установить ее снова, поэтому проверьте, установлена ​​она или нет!

Обратите внимание, что NodeStart теперь считается "устаревшим":

Вы можете добавить Procfile в исходный пакет, чтобы указать команду, запускающую ваше приложение, как показано в следующем примере. Эта функция заменяет устаревшую опцию NodeCommand в пространстве имен aws:elasticbeanstalk:container:nodejs.

В том же документе (источник ниже) говорится:

Когда вы не предоставляете Procfile, Elastic Beanstalk запускается npm start если вы предоставите package.jsonфайл. Если вы этого не предоставите, Elastic Beanstalk ищет файл app.js или же server.js, в этом порядке и запускает его.

Источник: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.container.html

Я забыл запустить npm install после клонирования, у меня сработало sudo npm install.

Я также столкнулся с этим, но это было из-за отсутствия одного из npm module, Вы можете увидеть пропавшие npm model имя в разделе журнала панели инструментов из эластичного бобового стебля. Он работал нормально на моей локальной машине только потому, что этот конкретный модуль npm был глобально установлен в моей системе.

В моем случае приложение node работало нормально, пока я не добавил CodePipeline AWS для автоматической загрузки кода в Elastic Beanstalk из GitHub. Чтобы решить эту проблему, я отключил каталог node_modules. Если Elastic Beanstalk обнаружит каталог node_modules, Elastic Beanstalk не запустит установку npm, даже если существует файл package.json.

Вам больше не нужно создавать .ebextensions, чтобы исправить эту ошибку, просто выполните следующие шаги.

Прежде всего, вы должны посмотреть журналы, которые выдает ваша среда. (Выберите первые записи, обычно это отображается в Консоли AWS в вашей среде.) Затем посмотрите, какой порт он вам бросает, если это 8080 или 8081, что наиболее распространено, как только это будет ясно, тогда он направляет вас к настройке в вашей текущей среде и добавляет переменную среды с именем порт и добавляет порт, который появляется в ваших журналах (реестр, который вы недавно просматривали) среды, в которой вы работаете, наконец, убедитесь, что в вашем основном файл (index.js или app.js что угодно!!), тот, который запускает ваш сервер, у вас есть этоconst PORT = process.env.port || 5900;... И, наконец, у вас также есть файл в вашем проекте в корне, если не просто создать, то ..., который называется Procfile , и в указанный файл вы добавляете следующую строку: web: npm start, эта строка запускает ваше приложение в bs(beanstealk), я оставлю несколько изображений для более подробной информации.

Первый захват.

Второй захват.

А теперь просто зайдите в папку вашего проекта и сделайте,

  • git add .тогда делай >git commit -m "Updated or whatever"

наконец запустите eb cmd ...eb deploy

Если вы получаете Nginx 502 Bad Gateway. Измените свой экземпляр AWS Elasticbeans Talk -> Программное обеспечение -> Nginx измените на Нет

Только что понял, что nginx подключается к узлу на 8081. Изменил порт узла на 8081, и теперь все в порядке..

Другие вопросы по тегам