502 Bad Gateway с nginx | Google App Engine | Node JS

Я размещаю веб-приложение на Google Cloud Platform с помощью App Engine, и я использую ExpressJS и MongoDB, который размещен на mLab.

Все хорошо работало до 1 января 2012 года. У меня был vm: true до этого и теперь был вынужден сменить env на flex. Теперь я получаю 502 ошибочную ошибку шлюза с nginx. Механизм приложений не позволяет нам изменять конфигурационный файл nginx.

Я пробовал предложение из этого сообщения: Google App Engine 502 (Bad Gateway) с NodeJS, но по-прежнему не работает.

По какой-то причине у меня есть другое приложение с точно такой же настройкой на движке приложения, и оно отлично работает.

Любое предложение будет принята с благодарностью. Спасибо.

Ответы

Ответ 2

проверить журналы для любых ошибок развертывания

$ gcloud app logs read

Я столкнулся с аналогичной проблемой с кодом, представленным в этом уроке (https://cloud.google.com/nodejs/getting-started/authenticate-users)

И обнаружил, что отсутствовала зависимость. Я исправил недостающую зависимость, и приложение развернуто и работает нормально.

Подробности в проблеме: https://github.com/GoogleCloudPlatform/nodejs-getting-started/issues/106

Ответ 3

У меня была такая же проблема с Express. Для меня это было не для того, чтобы предоставить IP-адрес приложения.

Итак, мой старый код:

var ip = "127.0.0.1";
var port = "8080";
var server = http.createServer(app);
server.listen(port, ip);

Это приведет к 502 в движке приложения.

Удаление ip было для меня решением.

server.listen(port);

Ответ 4

A 502 не обязательно является ошибкой с самим nginx, чаще всего это происходит, когда прокси-сервер nginx не может разговаривать с вашим контейнером приложения (обычно из-за невозможности запуска вашего приложения). Если вы получили 502 после перехода на "env: flex", это, скорее всего, связано с некоторыми изменениями кода, необходимыми в вашем приложении, как указано в "Обновление до последнего приложения" Гибкая версия среды для двигателей.

Проверка ваших журналов для ошибок из NPM также поможет определить точную причину неудачного запуска.

Ответ 5

Установите хост на 0.0.0.0

Порт 8080 по умолчанию установлен двигателем. На самом деле вы не можете определить переменную окружения PORT поскольку она зарезервирована.

Запустите следующую команду (как упомянуто @sravan)

gcloud app logs read tail

и убедитесь, что это выглядит так,

[Sun May 27 2018 10:32:44 GMT+0000 (UTC)] serving app on 0.0.0.0:8080

ура

Ответ 6

Пожалуйста, позаботьтесь о http также, при развертывании, это должен быть http-сервер, а не https

  var server;
  if (process.env.NODE_ENV == "dev") {
    server = https.createServer(httpsOptions, app);
  } else {
    server = http.createServer(app);
  }

Ответ 7

Google App Engine использует фронт nginx для балансировки нагрузки всех запросов на приложения node.js. Когда nginx выступает в качестве прямого прокси-сервера, эта ошибка обычно возникает, когда запрос, который пользователь делает в браузере, достигает nginx (вы видите страницу ошибок неверного шлюза 502 без стиля), но сервер nginx не может правильно перенаправить запрос на ваш сервер. приложение узла Может быть много проблем, почему это происходит, но вот некоторые из них:

  1. По умолчанию App Engine предполагает, что приложение вашего узла работает на 8080. Сам nginx будет работать на 80 и перенаправит запрос на 8080. Проверьте, не является ли номер порта вашего приложения 8080.

  2. Ваше приложение может иметь hostname, определенный как домен something.appspot.com или IP 127.18.21.21 или тому подобное. Удалите любые имена хостов из ваших server.listen или config.json или vhost где угодно. App Engine позаботится о доменах, IP-адресах и т.д., Поэтому вам не придется.

  3. Ваше приложение может зависать перед отправкой ответа на nginx. Проверьте журналы как nginx, так и приложения вашего узла.

Чтобы проверить журналы/выяснить, что происходит, используйте это руководство https://cloud.google.com/appengine/docs/flexible/nodejs/debugging-an-instance#connecting_to_the_instance для SSH непосредственно внутри виртуальной машины за механизмом приложения. В nginx будет один докер-процесс, в котором вы сможете просмотреть журнал ошибок nginx и один образ докера в приложении вашего узла, чтобы проверить сообщение об ошибке приложения вашего узла.

Мне просто интересно, исходя из активности в этом вопросе и временных меток, почему Google не обновил свою документацию для освещения этой проблемы !!!???

Ответ 8

Создайте сервер и затем проверьте с помощью троичного условия, является ли текущая среда производственной или нет, назначьте порт '80', если текущая среда находится в разработке, иначе назначьте process.env.NODE.ENV.

const app = require('express')();
        const server = require('http').Server(app);
        const port = process.env.NODE_ENV === 'production' ? process.env.PORT :'80';
        server.listen(port, ()=> {
          console.log('listening on port number  *:' + server.address().port);
         });