Google Cloud App Engine:Flask App出现502 Bad Gateway(nginx)错误

时间:2018-05-04 20:46:55

标签: python google-app-engine nginx flask google-cloud-platform

我在Google Cloud App Engine(flex)上运行Flask应用。在本地运行它可以正常工作,但一旦部署,我得到一个502 Bad Gateway error (nginx)。现在我想弄清楚导致这种情况的原因,但我找不到任何选项来查看我的应用程序创建的控制台日志。

由于它在我的本地环境中工作正常,我当前解决此问题的工作流程涉及在本地更改我的代码并部署它以查看它是否可以在以后工作,但每次部署只需要花费30分钟才能发现它仍然无法正常工作。必须有办法更有效地做到这一点。

关注文档https://cloud.google.com/appengine/docs/flexible/python/debugging-an-instance 我能够以调试模式SSH进入我的实例并从Cloud Shell启动Flask应用程序,但是它告诉我在http://127.0.0.1:8080/上访问它,我无法从云服务器访问它。因此,我无法浏览网页以重现502错误,然后在控制台中查看输出。

如何找出导致服务器上出现502错误的原因?

2 个答案:

答案 0 :(得分:1)

有类似的问题。 发现该应用引擎在main.py文件中查找应用变量。 我的最终app.yaml如下所示。

app.yaml

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

runtime_config:
 python_version: 3

并具有requirements.txt,如下所示。

requirements.txt

Flask==1.1.1
gunicorn==20.0.4

答案 1 :(得分:0)

这是我的理论:

    正在使用
  • localhost(127.0.0.1);应该使用0.0.0.0
  • 正在使用Flask内部WSGI服务器;应该使用例如Gunicorn

NB 您可以可以使用Cloud Shell开发和测试这些解决方案。 Cloud Shell(现在)包括一项web preview功能,该功能允许浏览在Cloud Shell实例上运行的服务器的端点(包括:8080)。

烧瓶

Flask包含开发(WSGI)服务器,并且教程通常包括:

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

如果以python somefile.py运行,则将使用Flask的内置(dev)服务器并将其公开在本地主机(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 -

例如独角兽

不应使用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

您可以使用Dockerfile在本地进行测试,并且-如果需要-将它们作为自定义运行时部署到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"]