繁体   English   中英

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

[英]Google Cloud App Engine: 502 Bad Gateway (nginx) error with Flask App

我正在 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 错误的原因?

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

应用程序.yaml

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

runtime_config:
 python_version: 3

并有requirements.txt,如下所示。

要求.txt

Flask==1.1.1
gunicorn==20.0.4

以下是我的理论:

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

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

烧瓶

Flask 包括一个开发(WSGI)服务器,教程通常包括:

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

其中,如果作为python somefile.py运行python somefile.py将使用 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

应用引擎 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"]

注意在上面,配置结果来自 somefile.py app.run(...)

对于 gunicorn:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM