【发布时间】:2021-03-20 09:12:58
【问题描述】:
前提/你想要达到的目标
我正在 Google App Engine 标准环境中使用 Python Flask 创建一个 Web 应用程序,我想将 app.yaml 设置如下,以便一个实例始终运行。
[app.yaml]
runtime: python37
instance_class: F2
inbound_services:
- warmup
entrypoint: gunicorn -b :$PORT --workers 2 --threads 2 main:app
automatic_scaling:
min_instances: 1
max_instances: 2
min_idle_instances: automatic
max_idle_instances: automatic
发生了什么以及您要检查什么
如果您将其放置一段时间而无法访问并检查日志, 您可以看到实例反复关闭和启动,如下所示。 (通常每小时重复几次。)
/_ah/warmup
[INFO] Starting gunicorn 20.0.4
[INFO] Listening at: http://0.0.0.0:8081 (7)
[INFO] Using worker: threads
[INFO] Booting worker with pid: 15
[INFO] Booting worker with pid: 18
[INFO] Handling signal: term
[INFO] Worker exiting (pid: 15)
[INFO] Worker exiting (pid: 18)
[INFO] Shutting down: Master
/_ah/warmup
[INFO] Starting gunicorn 20.0.4
[INFO] Listening at: http://0.0.0.0:8081 (7)
[INFO] Using worker: threads
[INFO] Booting worker with pid: 15
[INFO] Booting worker with pid: 17
由于设置了 min_instances,设置一个预热请求并设置它。 您还可以从日志中看到应用程序正在处理。 由于它是通过预热请求立即启动的,因此结果是始终启动一个实例,但这样一来,实例关闭并重复启动而没有任何访问权限是正确的行为。是不是吗?
补充资料
以下示例应用用于提问。
[requirements.txt]
Flask==1.1.1
gunicorn
[main.py]
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
@app.route('/_ah/warmup')
def warmup():
# Handle your warmup logic here, e.g. set up a database connection pool
return '', 200, {}
【问题讨论】:
-
您的实例正在被终止。可能是因为您的应用程序没有在端口 8080 上侦听。为什么要在端口 8081 上侦听?默认值为 8080。在您更改默认端口号的问题中,我看不到任何内容。你的日志有日期和时间吗?从
Starting gunicorn 20.0.4到收到Handling signal: term的时间间隔是多少? -
您没有明确指定端口 8081。我只是将它写在 app.yaml 的入口点中,就像在 App Engine 文档中一样。顺便说一句,即使在这种状态下,您也始终可以访问 Web 应用程序。启动 gunicorn 20.0.4 和接收到处理信号之间的时间间隔:术语并不总是恒定的。它可以从几分钟到几十分钟,甚至几个小时。我想知道实例多次关闭和启动是否正确。
-
你在哪里为
warmup指定处理程序? -
你说它每小时关闭几次,所以听起来你的应用程序在某种程度上正在运行。我的猜测是您超出了内存限制,这会导致关机。尝试增加实例内存。
-
预热处理程序由 main.py 中的 @app.route('/_ah /warmup') 指定,如 Google 文档中所述。 cloud.google.com/appengine/docs/standard/python3/…
标签: python google-app-engine flask google-cloud-platform gunicorn