Python 3 运行时环境 - App Engine - Google Cloud。

Python 运行时是负责安装 Web 服务代码及其依赖项并运行 App Engine 服务的软件栈。

适用于 App Engine 标准环境的 Python 运行时在 app.yaml 文件中进行声明:

runtime: pythonVERSION

其中,VERSION 是 Python MAJORMINOR 版本号。例如,如需使用最新的 Python 版本 Python 3.14(预览版),请指定 314

如需了解其他受支持的 Python 版本以及 Python 版本对应的 Ubuntu 版本,请参阅运行时支持时间表

Python 3 版本

支持的最新 Python 版本为 3.14(预览版)。Python 运行时使用 app.yaml 文件中指定的版本的最新稳定版。App Engine 会自动更新到新的补丁版本,但不会自动更新次要版本。

例如,您的应用可能部署在 Python 3.7.0,并在之后自动更新到 Python 3.7.1,但它不会自动更新到下一个次要版本 Python 3.8.0。

App Engine 在容器上运行 Python 应用,并由 gVisor 通过最新的 Ubuntu Linux 发行版保护。

依赖项

在部署期间,App Engine 会使用 Python 软件包管理器 pip 来安装项目根目录下 requirements.txt 元数据文件中定义的依赖项。由于 App Engine 会执行全新安装,因此您无需上传依赖项。

目前不支持使用 Pipfile/Pipfile.lock 标准的依赖项规范,且您的项目中不得存在这些文件。

应用启动

运行时通过运行您在 app.yaml 文件的 entrypoint 字段中指定的命令来启动应用。如果您已在 app.yaml 文件中配置 Gunicorn Web 服务器入口点,则还必须将 gunicorn 添加到 requirements.txt 文件中。

入口点应启动一个 Web 服务器以监听由 PORT 环境变量指定的端口。例如:

entrypoint: gunicorn -b :$PORT main:app

应用使用的 Web 框架负责将请求路由到应用中的相应处理程序。

如果您的应用满足以下要求,并且您未指定 entrypoint 字段,App Engine 将使用 gunicorn Web 服务器启动您的应用:

  • 您的应用目录根路径包含一个 main.py 文件,内附一个名为 app 且与 WSGI 兼容的对象。

  • 您的应用不包含 PipfilePipfile.lock 文件。

如果您没有为 Python 3 运行时指定入口点,则 App Engine 会配置并启动默认的 Gunicorn Web 服务器。

入口点最佳做法

  • 确保运行 app.yaml 中指定的入口点所需的 Python 模块存在于 requirements.txt 文件中。仅当 app.yaml 文件中明确指定了 gunicorn 端点时,才将 gunicorn 添加到 requirements.txt 文件中。

  • 为获得最佳性能,入口点应该是轻量级的,因为每次创建应用的新实例时入口点都会运行。

  • 您可以使用入口点字段调整应用的性能。例如,如果您使用 gunicorn 作为 Web 服务器,则可以使用入口点字段中的 --workers 标志配置为您的应用提供服务的工作器的数量。

    您指定的工作器数量应与 App Engine 应用的实例类相匹配:

    实例类别 工作器
    F1 2
    F2 4
    F4 8
    F4_1G 8
    B1 2
    B2 4
    B4 8
    B4_1G 8
    B8 8

    如需选择工作器数量,可先查看该指南。您可能需要使用不同数量的工作器,具体取决于您的应用的性能特征。下面的示例展示了使用两个 gunicorn 工作器为应用提供服务的 App Engine 部署:

    entrypoint: gunicorn -b :$PORT -w 2 main:app
    
  • 我们建议您将 Web 服务器配置为在 $PORT 环境变量指定的端口上侦听和响应 HTTP 请求。使用默认端口 8080 可防止 App Engine 使用其 NGINX 层来压缩 HTTP 响应。请注意,如果您使用端口 8080,则有关端口 8080 和 NGINX 的警告将显示在应用的日志文件中。

其他 Web 框架

除了 Django 和 Flask 之外,您还可以将其他网络框架与 App Engine 搭配使用,例如 uwsgiTornado。以下示例展示了如何将 uwsgi 与 App Engine 搭配使用:

runtime: python313
entrypoint: uwsgi --http-socket :$PORT --wsgi-file main.py --callable app --master --processes 1 --threads 2
uwsgi==2.0.22
Flask==3.0.0

环境变量

以下环境变量由运行时设置:

环境变量 说明
GAE_APPLICATION App Engine 应用的 ID。此 ID 以“region code~”为前缀,例如“e~”(对于在欧洲部署的应用)。
GAE_DEPLOYMENT_ID 当前部署的 ID。
GAE_ENV App Engine 环境。设置为 standard
GAE_INSTANCE 当前运行您的服务的实例的 ID。
GAE_MEMORY_MB 可供应用进程使用的内存量,以 MB 为单位。
GAE_RUNTIME app.yaml 文件中指定的运行时环境。
GAE_SERVICE app.yaml 文件中指定的服务名称。如果未指定服务名称,则将其设置为 default
GAE_VERSION 服务的当前版本标签。
GOOGLE_CLOUD_PROJECT 与您的应用关联的 Google Cloud 项目 ID。
PORT 接收 HTTP 请求的端口。
NODE_ENV(仅在 Node.js 运行时中可用) 当服务已部署时,将其设置为 production

您可以app.yaml 文件中定义其他环境变量,但不能替换上述值(NODE_ENV 除外)。

HTTPS 和转发代理

App Engine 在负载均衡器上终止 HTTPS 连接,并将请求转发到您的应用。某些应用需要确定原始请求 IP 地址和协议。用户的 IP 地址可在标准 X-Forwarded-For 标头中获取。对于需要此信息的应用,应将其 Web 框架配置为信任代理。

文件系统

运行时包含一个完整的文件系统。该文件系统是只读的,但位置 /tmp 除外(该位置是在 App Engine 实例的 RAM 中存储数据的虚拟磁盘)。

元数据服务器

应用的每个实例都可以使用 App Engine 元数据服务器来查询有关实例和项目的信息。

您可以通过以下端点访问元数据服务器:

  • http://metadata
  • http://metadata.google.internal

发送到元数据服务器的请求必须包含请求标头 Metadata-Flavor: Google。此标头表明请求是为了检索元数据值而发出的。

下表列出了您可以针对特定元数据发出 HTTP 请求的端点:

元数据端点 说明
/computeMetadata/v1/project/numeric-project-id 分配给项目的项目编号。
/computeMetadata/v1/project/project-id 分配给项目的项目 ID。
/computeMetadata/v1/instance/region 实例运行的区域。
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email 分配给项目的默认服务账号电子邮件地址。
/computeMetadata/v1/instance/service-accounts/default/ 列出项目的所有默认服务账号。
/computeMetadata/v1/instance/service-accounts/default/scopes 列出默认服务账号的所有受支持范围。
/computeMetadata/v1/instance/service-accounts/default/token 返回可用于向其他 Google Cloud API 验证您的应用的身份验证令牌。

例如,要检索您的项目 ID,请向 http://metadata.google.internal/computeMetadata/v1/project/project-id 发送请求。