Google App Engine 502 (плохой шлюз) с NodeJS

У меня есть полное веб-приложение, использующее NodeJS, MongoDB (Mongoose в качестве драйвера) и ExpressJS.

Проект отлично работает на моей локальной машине. Сегодня я решил переместить все на производство. Я использую Google App Engine для размещения своего приложения и Compose (формально MongoHQ) для размещения моей базы данных.

Сервер приложений Engine Engine отлично работает, хотя мой API, похоже, не работает. Мой API работает от example.com/api, и каждый запрос (GET, POST, DELETE и PUT) возвращает ошибку 502 (Bad Gateway).

Я попытался запустить свое приложение на своей локальной машине, подключившись к моей удаленной базе данных MongoDB, и это сработало отлично. Поэтому это должно быть проблемой с App Engine или NodeJS, а не с MongoDB.

Я попытался проверить все журналы ошибок в Google Cloud, хотя ошибок нет.

Почему App Engine/NodeJS отлично работает со статическим контентом приложения, хотя не разрешает какие-либо запросы к моему API?

Ответы

Ответ 1

502 Bad Gateway обычно является ошибкой на стороне Nginx. К сожалению, эти журналы еще не всплыли в Cloud Logging.

Много раз проблема заключается в том, что ваши HTTP-пакеты слишком велики для буферов или чего-то подобного. Способ просмотра журнала nginx выглядит примерно так:

  • Используйте только 1 виртуальную машину. Это не обязательно, но много раз это упрощает отладку приложения, если вы знаете, что ваши запросы на одном компьютере. Вы можете сделать это, добавив это в свой app.yaml:

manual_scaling: instances: 1 затем повторно разверните

  • Переключите виртуальную машину с "принадлежащего Google" на самоуправление. Это можно сделать в Cloud Console. Перейдите в Compute Engine, экземпляры, щелкните имя экземпляра, соответствующее версии App Engine, и вы должны увидеть, что нужно переключить его на самостоятельное управление.

  • gcloud compute ssh <instance name> для SSH на машине

  • docker ps, чтобы увидеть ваши запущенные контейнеры. Найдите контейнер с именем nginx и возьмите его идентификатор.

  • После того, как у вас есть идентификатор контейнера, вы должны иметь возможность docker exec -it <container id> -- cat /var/log/nginx/error.log. Вам может понадобиться ls весь каталог журнала.

Вероятно, вы увидите ошибку там, где будет больше намека на то, что происходит не так.

Я знаю, что это намного сложнее, чем должно быть: -\Если у вас возникли проблемы с описанными выше шагами, оставьте комментарий. Если вы нашли ошибку и не знаете, что с ней делать, также оставляйте комментарий.