Python 3 运行时环境

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

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

runtime: pythonVERSION

其中,VERSION 是 Python MAJORMINOR 版本号。例如,如需使用最新的 Python 版本 Python 3.12,请指定 312

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

Python 3 版本

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

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

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估 App Engine 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费试用 App Engine

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: python39
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 发送请求。