Google Cloud App Engine: ошибка 502 Bad Gateway (nginx) с приложением Flask - PullRequest
0 голосов
/ 04 мая 2018

Я использую приложение Flask в Google Cloud App Engine (flex). Запуск его локально работает просто отлично, но после его развертывания я получаю 502 Bad Gateway error (nginx). Теперь я хотел бы выяснить, что является причиной этого, но я не могу найти никакой опции для просмотра журналов консоли, которые создает мое приложение.

Поскольку в моей локальной среде он отлично работает, мой текущий рабочий процесс для решения этой проблемы включает изменение моего кода локально и его развертывание, чтобы увидеть, работает ли он впоследствии, но каждое развертывание занимает более 30 минут, только чтобы выяснить, что оно все еще не работает. , Должен быть способ сделать это более эффективно.

После документов https://cloud.google.com/appengine/docs/flexible/python/debugging-an-instance Мне удалось подключиться к моему экземпляру по SSH в режиме отладки и запустить приложение Flask из облачной оболочки, однако оно говорит мне, что я должен получить к нему доступ http://127.0.0.1:8080/, к которому у меня нет доступа с облачного сервера. Поэтому я не могу перемещаться по веб-странице, чтобы воспроизвести ошибку 502, а затем увидеть вывод в консоли.

Как я могу выяснить, что вызывает ошибку 502 на сервере?

1 Ответ

0 голосов
/ 08 мая 2019

Вот мои теории:

  • localhost (127.0.0.1) используется; следует использовать 0.0.0.0
  • Используется внутренний WSGI-сервер Flask; следует использовать, например, Gunicorn

NB Вы можете разрабатывать и тестировать эти решения с помощью Cloud Shell. Cloud Shell (сейчас) включает в себя веб-предварительный просмотр , который позволяет просматривать конечные точки (включая :8080) для серверов, работающих на экземпляре Cloud Shell.

Настой

Flask включает сервер разработки (WSGI), а учебные пособия обычно включают:

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)

Который, если запускать как python somefile.py, будет использовать встроенный (dev) сервер Flask и выставлять его на localhost (127.0.0.1).

Это недоступно для других машин:

 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 244-629-469

Если вместо этого используется host='0.0.0.0', это будет работать:

 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 244-629-469
192.168.9.1 - - [08/May/2019 23:59:59] "GET / HTTP/1.1" 200 -
192.168.9.1 - - [08/May/2019 23:59:59] "GET /favicon.ico HTTP/1.1" 404 -

например. Gunicorn

Встроенный сервер Flask не должен использоваться, и документация Flex описывает, как использовать gunicorn (одна из различных альтернатив), должна быть настроена:

https://cloud.google.com/appengine/docs/flexible/python/runtime#application_startup

Что, если запустить gunicorn --bind=0.0.0.0:8080 main:app, даст:

[INFO] Starting gunicorn 19.9.0
[INFO] Listening at: http://0.0.0.0:8080 (1)
[INFO] Using worker: sync
[INFO] Booting worker with pid: 7

App Engine Flex

При использовании рекомендуемой конфигурации app.yaml будет включать в себя:

runtime: python
env: flex
entrypoint: gunicorn --bind:$PORT main:app

Dockerfiles

Вы можете протестировать их локально с помощью Dockerfiles и - при желании - развернуть их во Flex в качестве пользовательских сред выполнения (после изменения app.yaml):

FROM python:3.7-alpine

WORKDIR /app
ADD . .

RUN pip install -r requirements.txt

Для колб добавить:

ENTRYPOINT ["python","main.py"]

NB Как указано выше, конфигурация получается из файла somefile.py app.run(...)

А для огнестрельного оружия:

ENTRYPOINT ["gunicorn","--bind=0.0.0.0:8080","main:app"]
...