Python 运行时是负责安装应用代码和依赖项,然后在柔性环境中运行该应用的软件栈。
Python 版本
Python 3.12 使用buildpack。如需查看受支持的 Python 版本及其对应 Ubuntu 版本的完整列表,请参阅运行时支持时间表。
如需使用支持的 Python 版本,您必须:
将
runtime_config
和operating_system
设置添加到app.yaml
文件中以指定操作系统。安装
gcloud
CLI 420.0.0 或更高版本。您可以通过运行gcloud components update
命令来更新 CLI 工具。如需查看已安装的版本,请运行gcloud version
命令。(可选)您可以通过在
app.yaml
文件中添加runtime_version
设置来指定运行时版本。默认情况下,如果未指定runtime_version
设置,则使用最新的 Python 版本。
示例
如需在 Ubuntu 22 上指定 Python 3.12,请执行以下操作:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu22" runtime_version: "3.12"
如需在 Ubuntu 22 上指定支持的最新 Python 版本,请执行以下操作:
runtime: python env: flex entrypoint: gunicorn -b :$PORT main:app runtime_config: operating_system: "ubuntu22"
如需了解详情,请参阅 app.yaml
参考页面。
过往运行时版本
对于 Python 3.7 版及更低版本,您可以在应用的 app.yaml
文件中使用 runtime_config
和 python_version
设置来指定版本。
示例
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3.7
对于 Python 3.7 版及更早版本,如果省略 runtime_config
或 python_version
,则默认解释器为 Python 2.7.12。例如,您可以通过在 app.yaml
文件中指定 runtime: python
来使用默认运行时:
runtime: python
env: flex
如需了解详情,请参阅 app.yaml
参考页面。
为每个版本设置部署的解释器如下表所示:
python_version 设置 |
部署的解释器 | 运行时 ID | app.yaml 示例 |
---|---|---|---|
2 (默认) |
2.7.12 | python2 |
runtime_config: python_version: 2 |
3.4 |
3.4.8 | python34 |
runtime_config: python_version: 3.4 |
3.5 |
3.5.9 | python35 |
runtime_config: python_version: 3.5 |
3 或 3.6 |
3.6.10 | python36 |
runtime_config: python_version: 3 |
3.7 |
3.7.9 | python37 |
runtime_config: python_version: 3.7 |
对其他 Python 运行时的支持
如果您需要使用不受支持的 Python 版本,可以创建自定义运行时,并选择带有所需 Python 版本的有效基础映像。
对于 Google 提供的基础映像或 Docker Python 基础映像,请参阅构建自定义运行时。
如需进一步了解适用于 Cloud Run 的 App Engine 应用容器化,请参阅迁移指南。
依赖项
在启动应用之前,运行时会在应用的源代码目录中查找 requirements.txt
文件,并使用 pip
安装所有依赖项。如需详细了解如何声明和管理软件包,请参阅使用 Python 库。
如果您的应用需要专用依赖项,您将需要使用基于 Python 运行时的自定义运行时来安装相应的软件包。
应用启动
运行时使用 app.yaml
文件中定义的 entrypoint
来启动应用。entrypoint 应启动一个进程,以响应环境变量 PORT
所定义端口上的 HTTP 请求。
大多数 Web 应用都使用 WSGI 服务器,例如 Gunicorn、uWSGI 或 Waitress。
如需使用其中一个服务器,您必须将其作为依赖项添加到应用的 requirements.txt
文件中。
如果您将 gunicorn
用于 Flask 应用,请确保应用的 Python 版本与 gunicorn
兼容。
运行时会确保所有依赖项均在 entrypoint 调用之前安装完毕。
Flask==2.0.2
gunicorn==20.1.0
在 Flask 应用中使用 gunicorn 时对应的 entrypoint 示例:
entrypoint: gunicorn -b :$PORT main:app
在 Django 应用中使用 gunicorn 时对应的 entrypoint 示例:
entrypoint: gunicorn -b :$PORT mydjangoapp:wsgi
建议您使用 Gunicorn 作为 WSGI 服务器,但您完全可以使用任何其他 WSGI 服务器。下面提供了一个将 uWSGI 与 Flask 搭配使用的 entrypoint 示例:
entrypoint: uwsgi --http :$PORT --wsgi-file main.py --callable app
对于可以在没有 WSGI 服务器的情况下处理请求的应用,您只需执行 Python 脚本:
entrypoint: python main.py
推荐的 Gunicorn 配置
上面所示的基本 entrypoint 示例只是个学习起点,可能适用于您的 Web 应用,但是,大多数应用将需要进一步配置 WSGI 服务器。在项目的 app.yaml
文件所在的根目录中创建 gunicorn.conf.py
文件(而不是在入口点指定所有设置),并在入口点中指定它:
entrypoint: gunicorn -c gunicorn.conf.py -b :$PORT main:app
如需了解 Gunicorn 的所有配置值,您可以阅读其文档。
工作器
Gunicorn 使用工作器来处理请求。默认情况下,Gunicorn 使用同步工作器。此类工作器与所有 Web 应用都兼容,但每个工作器一次只能处理一个请求。默认情况下,gunicorn 只使用其中一个工作器。这通常会导致您的实例得不到充分利用,并且可能会增加高负载应用的延迟时间。
我们建议您将工作器数量设置为实例的 CPU 核心数的 2 至 4 倍再加一。您可以在 gunicorn.conf.py
中将此字段指定为:
import multiprocessing
workers = multiprocessing.cpu_count() * 2 + 1
另外,一些主要受 I/O 约束的 Web 应用可以通过使用不同的工作器类别来实现性能的提升。
如果您的工作器类需要其他依赖项(例如 gevent 或 tornado),则需要在应用的 requirements.txt
中声明这些依赖项。
HTTPS 和转发代理
App Engine 在负载均衡器上终止 HTTPS 连接,并将请求转发给应用。大多数应用不需要知道请求是否通过 HTTPS 发送,但需要此信息的应用应将 Gunicorn 配置为信任其 gunicorn.conf.py
中的 App Engine 代理:
forwarded_allow_ips = '*'
secure_scheme_headers = {'X-FORWARDED-PROTO': 'https'}
Gunicorn 现在将确保 wsgi.url_scheme
到 'https'
(大多数网络框架将使用该标志来指示请求是安全的)。如果您的 WSGI 服务器或框架不支持此功能,只需手动检查X-Forwarded-Proto
标头的值即可。
某些应用还需要确定用户的 IP 地址。该地址可在 X-Forwarded-For
标头中获取。
请注意,gunicorn.conf.py
中的 secure_scheme_headers
设置应为大写(如X-FORWARDED-PROTO
),但您的代码可以读取的标头将为混合大小写(如 X-Forwarded-Proto
)。
扩展运行时
柔性环境 Python 运行时可用于创建自定义运行时。如需了解详情,请参阅自定义 Python。
环境变量
以下环境变量由运行时环境设置:
环境变量 | 说明 |
---|---|
GAE_INSTANCE |
当前实例的名称。 |
GAE_MEMORY_MB |
可供应用进程使用的内存量。 |
GAE_SERVICE |
在应用的 app.yaml 文件中指定的服务名称,如果未指定服务名称,则设置为 default 。 |
GAE_VERSION |
当前应用的版本标签。 |
GOOGLE_CLOUD_PROJECT |
与您的应用关联的项目 ID,可在 Google Cloud 控制台中查看 |
PORT |
将接收 HTTP 请求的端口。 |
您可以在 app.yaml
文件中设置其他环境变量。
元数据服务器
应用的每个实例都可以使用 Compute Engine 元数据服务器来查询实例的相关信息,包括实例的主机名、外部 IP 地址、实例 ID、自定义元数据和服务账号信息。App Engine 不支持设置每个实例的自定义元数据,但您可以设置项目级的自定义元数据,并从 App Engine 和 Compute Engine 实例中读取这些数据。
此示例函数使用元数据服务器来获取实例的外部 IP 地址: