Приложение Flask возвращает «502: Bad Gateway», потому что Google Sloud SDK считает, что порт используется ([вероятно] нет) - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь развернуть довольно простое приложение Flask с парой представлений, используя Google App Engine. Насколько я знаю, в самом коде Flask нет ничего плохого - он прекрасно работает на локальном порту. Проблема, однако, возникает, когда я перехожу в каталог проекта и запускаю «gcloud app deploy». Приложение развертывается без ошибок и возвращает код 502, когда я захожу в домен .appspot.com, зарезервированный для приложения.

Я был немного смущен, поэтому я запустил "хвосты журналов приложений gcloud". Это сообщение, которое отображается при повторении в журналах:

* 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:5000/ (Press CTRL+C to quit)
[2019-01-06 23:55:00 +0000] [240] [INFO] Starting gunicorn 19.9.0
[2019-01-06 23:55:00 +0000] [240] [ERROR] Connection in use: ('', 8081)
[2019-01-06 23:55:00 +0000] [240] [ERROR] Retrying in 1 second.
[2019-01-07 23:55:01 +0000] [240] [ERROR] Can't connect to ('', 8081)

Запуск "netstat -ano" не показывает процессов, которые фактически используют порт 8081. Запуск netstat и уничтожение любого процесса, использующего занятый порт, были предложены в посте с проблемой, аналогичной моей. Тем не менее, здесь буквально ничего нет, используя 8081.

"main" - это main.py, файл, который создает приложение, регистрирует все чертежи и запускает приложение с

app.run(host="0.0.0.0", debug=True)

Я совершенно новичок в использовании App Engine - я что-то упустил? Кто-нибудь знает, с чего начать?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я протестировал проблему на своей стороне и смог воспроизвести сообщение об ошибке.

Проблема в том, что в вашем файле main.py вы вызываете строку app.run(host="0.0.0.0", debug=True) из корня вашего скрипта.

Вы должны иметь эту строку внутри main.py, как показано здесь:

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

То, что делает обусловление , заключается в том, чтобы убедиться, что его вложенные операторы выполняются только при непосредственном выполнении файла, то есть при запуске python main.py на вашем локальном компьютере.

То, что делает оператор app.run , состоит в том, чтобы запускать приложение Flask на локальном сервере разработки, который создается в направлении хоста (в вашем случае «0.0.0.0», что в фляге означает что приложение выставлено извне), и в конкретном порту (по умолчанию 5000).

Вы используете gunicorn в качестве точки входа в приложение и указываете на объект app внутри сценария main, как определено в файле app.yaml. Но поскольку приложение фляги уже запущено на другом сервере, созданном оператором app.run, gunicorn не может указывать на приложение, поэтому он не может обслуживать запросы.

Короче говоря, не выполняйте app.run при развертывании в App Engine.

0 голосов
/ 07 января 2019

Google App Engine использует веб-процесс gunicorn для обслуживания приложения, поэтому app.run () в основном файле работает только локально и ничего не меняет для веб-сервера, если вы не укажете точку входа.

Вы указываете точку входа в app.yaml? Попробуйте добавить следующую строку в ваш app.yaml и добавить gunicorn в ваш requirements.txt.

entrypoint: gunicorn -b :$PORT main:app
...