App Engine 常见问题解答

如何登录 App Engine 帐号?

对于普通 Google 帐号(包括 Gmail 用户),您可以通过访问 Google Cloud Platform Console 来登录自己的 App Engine 帐号。

如何为 App Engine 创建 Cloud 项目?

使用 Google Cloud Platform Console 创建 Cloud 项目

Google App Engine 支持哪些语言?

目前,App Engine 标准环境支持 JavaPythonPHPGoNode.js。此外,您还可以将 JavaScript 以及您的 HTML 添加到网站模板中,从而执行编写支持 AJAX 的 Web 应用等很多操作。

App Engine 获得了哪些类型的认证?

App Engine 已成功完成了 SAS70 Type IISSAE 16 Type IIISO 27001ISAE 3402 Type II 标准的审核流程。

我对自己创建的项目有哪些权限?

对于 Google 与 App Engine 客户而言,客户拥有其存储数据及其应用和项目代码的所有知识产权。Google 拥有 App Engine 和 Google Cloud Platform 服务与软件的所有知识产权。

如需了解详情(包括这些术语的定义),请参阅 Google Cloud 服务条款

如果我没有帐号,还可以开发 App Engine 应用吗?

当然可以!即使您还没有 App Engine 帐号,也可以随时下载我们的 SDK 并开始进行开发。

我可以使用 App Engine 创建多少个应用?

您可以创建的 App Engine 项目数量取决于多种因素,包括您使用的资源以及之前的 Google Cloud Platform 使用记录。根据这些因素和其他因素,客户可能会获得不同的配额。

如果您尝试超出项目限额,GCP Console 会提示您填写申请表单。当您在已达到配额的情况下尝试创建项目时,就会发生这种情况。您需要在此表单中指定所需的其他项目数量,以及相应的电子邮件帐号、结算帐号和使用目的。

如需详细了解如何申请增加配额,请参阅项目配额申请页面。

Google App Engine 支持哪种类型的内容?

如果您对 App Engine 支持的内容类型有疑问,请参阅我们的服务条款

/favicon.ico 为何出现 URI 错误?

未添加 favicon.ico 文件的应用可能包含错误 URI 列表上的 URI /favicon.ico。Favicon.ico 是用户的网络浏览器在尝试加载页面时请求的文件。Favicon.ico 是您网站的图标,通常显示在用户浏览器的网址栏中,位于网站的网址旁边。

对于您的应用来说,favicon.ico 应是一个静态图片。您可以将 favicon.ico 文件随应用一起上传,并在 app.yaml 文件中配置应用,以便在请求 /favicon.ico 网址时提供该图片。下面提供了 appengine-web.xml (Java) 和 app.yaml (Python/PHP/Go) 中的条目示例。在 Python/PHP/Go 示例中,favicon.ico 位于 static/images 中。为简单起见,在 Java 示例中,此文件位于根目录 (war) 中。

Python/PHP/Go

app.yaml
- url: /favicon\.ico
  static_files: static/images/favicon.ico
  upload: static/images/favicon\.ico

Java

appengine-web.xml
<static-files>
  <include path="/favicon.ico" />
</static-files>

什么是 GQL?

GQL 是一种适用于 Datastore 的查询语言。Python 应用可以使用此语言来查询实体。GQL 使用类似于 SQL 的语法从应用的 Datastore 中检索整个实体,并支持按属性进行过滤、指定结果排序顺序以及限制返回的实体数。可以在此处找到完整的 GQL 语言参考。

GQL 是否可用于 Java?

Java SDK 中不包含 GQL,但您可以通过 Cloud Datastore API 使用该语言。我们建议 Java 开发者使用 JDOJPA 来代替 GQL,因为它们是类型安全的语言。使用 JDO/JPA,开发者可以在 IDE 中(而不是在运行时)发现错误,从而降低发生 SQL 注入攻击的机会。

为什么我的查询需要使用索引?如何添加索引?

如果您所运行的查询是按多个实体属性过滤数据或按多个属性排序结果,那么您将需要创建索引才能执行此查询。此类随应用一起运行的查询都必须具有索引。查询的 Datastore 索引会维护并更新按查询指定的方式排序的键列表,以便快速访问 Datastore 中的数据。如需了解 Datastore 索引的完整说明,请参阅我们的文档 (Java | Python | Go)。

使用 Cloud SDK 开发应用时,您运行的每个查询都会在必要时自动编入索引。如果您在将应用上传到网站之前对其进行了全面测试,那么应用所需的所有索引都将包含在应用的 index.yaml 文件中。如果您发现开发测试不支持某个查询,则可手动添加索引。如需详细了解如何为应用编写索引,请参阅索引文档。

为什么我的索引被标记为“错误”?

这些可能是爆炸式索引 (Python | Java | Go),或者在数据存储区中编写特定实体时可能发生了其他类似问题。您可以按照“查询”(Python | Java | Go) 和“索引”(Python | Java | Go) 部分中的说明,清空这些索引并重新尝试构建它们。

为什么我的索引长时间地保持“正在构建”或“正在删除”状态?

即使相应种类的实体数量不是很多,构建或删除索引所需的时间也可能会有很大差异,具体取决于 Datastore 中的数据总量、当前正在针对其他应用构建的索引以及与用户请求相关的 Datastore 负载等诸多因素。在某些情况下,索引作业可能需要几个小时、甚至几天才能完成。

即便如此,有时我们仍会帮助处理貌似停滞不前的索引。如果您认为自己的索引发生了这种情况,您可以向 google-appengine 群组发帖提问。

如何对使用我的应用的用户进行身份验证?

借助用户服务 (Java | Python | Go),您可以对拥有 Google 帐号(用户自己的 G Suite 网域中的帐号)的用户进行身份验证。您可以为应用选择以下某种身份验证形式。

如果您的应用使用 Google 帐号,则当应用请求用户登录时,用户将被定向到 Google 登录页面,以便输入用户名和密码或创建一个新帐号。成功登录之后,用户将返回至您的网站,且用户信息将通过 Users 属性提供给您的应用。

有没有不受 App Engine 支持的第三方库?

Python

只有很少一部分原生 C Python 模块以及原生 C Python 模块的子级不受 App Engine 支持。已停用的模块分为以下几个类别:

  • Python App Engine 不支持使用库来维护磁盘上的数据库
  • 系统不允许调用子进程,因此某些模块操作系统方法已停用
  • 线程不可用
  • 由于安全方面的原因,大多数基于 C 的模块均已停用
  • 其他受限制的功能如下:
    • 编组已停用
    • cPickle 已取别名为 pickle
    • 系统调用已停用

请注意,使用上述任何功能的第三方软件包将无法与 App Engine 配合使用(PostgreSQL 等软件包)。

Go

大多数纯 Go 软件包都适用于 App Engine。如果某个软件包不起作用,可能的原因如下所示:

  • 该软件包导入 syscallunsafe
  • 该软件包使用 cgo 或程序集。
  • 该软件包需要锁定软件包中的函数,例如向磁盘写入数据或直接访问网络。

我的应用为什么会被停用?

如果应用未能遵守我们的条款及条件,就可能会被停用。此外,如果我们发现应用因为错误或其他导致资源使用效率低下的问题而过度使用系统资源,我们可能会停用该应用,这样,开发者就能够先使用我们的开发 SDK 解决这些开发问题,然后再在 Google App Engine 上重新启用该应用。

我的应用为什么会超出配额?

App Engine 对一个应用在一天中可以消耗的各种系统资源设定了配额限制。所有应用都具有默认的配额配置,即“免费配额”,对于高效的应用来说,该配额应支持每月大约 500 万次的网页浏览量。如需详细了解系统配额,请参阅配额文档

随着应用规模的扩大,所需的资源分配可能会超过默认配额配置所提供的值。您可以通过为应用启用结算功能来购买额外的计算资源。借助结算功能,开发者可提高所有系统资源的限额,并可为更高的 CPU、带宽、存储空间和电子邮件用量限额付费。

如何报告违反了条款及条件的应用?

如需报告违反 App Engine 条款及条件的应用,请与我们联系。我们将确定该应用是否违规,并在必要时联系违规应用的开发者。

是否应使用 SDK 来处理外部请求?

dev_appserver 设计用于进行本地测试,默认情况下,它不允许外部连接。您可以在运行 dev_appserver 时使用 --host <hostname> 标志来替换此设置,但不建议这样做,因为 SDK 尚未经过安全强化,并可能存在漏洞。

如何提供压缩内容?

App Engine 会尽其所能为支持 Gzip 压缩内容的浏览器提供这些内容。该架构会自动执行,无需对应用作任何修改。

我们将组合使用请求标头(Accept-Encoding、User-Agent)和响应标头 (Content-Type) 来确定最终用户能否使用 Gzip 压缩内容。此方法可避免常用浏览器中的 Gzip 压缩内容出现一些常见错误。若要强制提供 Gzip 压缩内容,客户端可提供“gzip”作为 Accept-Encoding 和 User-Agent 请求标头的值。如果没有 Accept-Encoding 标头,则内容绝不会经过 Gzip 压缩。

如需了解详情,请参阅运行时环境文档 (Python | Java | PHP | Go)。

App Engine 是否支持 SSL (HTTPS)?

App Engine 允许您通过 appspot.com 网域提供 SSL (HTTPS) 流量。只需将“secure”参数添加到 app.yaml 处理程序,即可获取要用来支持安全流量的网址。如需全面了解如何配置应用以确保流量安全,请参阅有关应用配置的文档 (Java | Python | PHP | Go)。

您还可以使用自定义网域提供 SSL (HTTPS) 流量。如果搭配 SSL 使用自定义网域,则还可以使用裸网域。

我可以在项目中使用 Strict-Transport-Security 标头吗?

可以在 App Engine 中使用 Strict-Transport-Security。要将 HTTP Strict-Transport-Security 标头 (HSTS) 添加到应用中,您必须在应用的代码中实现此标头,而不是在应用的配置文件(app.yamlappengine-web.xml)中。

我可以在 App Engine 上通过自己的自定义网域使用 SSL (HTTPS) 吗?

您可以通过自己的自定义网域提供 SSL

remote_api 等工具是否使用 SSL (HTTPS)?

使用登录功能的 SDK 工具(remote_api、appengine_rpc)会使用 SSL 来传递您的电子邮件地址和密码。

Python 和 Go SDK 可以通过远程连接验证 SSL 证书。为此,您必须在系统上安装 ssl Python 模块。如果您使用的是 Python 2.5,则可以从 http://pypi.python.org/pypi/ssl/ 安装该模块。如果在验证 SSL 证书时发生错误,那么这些工具将引发 InvalidCertificateException,并提供问题说明。

默认情况下,Java SDK 还支持 SSL。如果在验证 SSL 证书时遇到错误,则 Java SDK 将抛出 javax.net.ssl.SSLHandshakeException

我想将我的应用映射到裸网域(例如 http://example.com)。

借助“裸网域”,用户可以直接通过域名 (http://example.com) 访问您的应用,而无需子网域(例如 http://www.example.com 或 http://myapp.example.com)。您可以在 Google Cloud Platform 项目控制台中为您的 App Engine 应用设置裸网域。请参阅使用自定义网域

如果您搭配 SSL 使用自定义网域,还可以使用裸网域。

静态 IP 地址和 App Engine 应用

目前,App Engine 无法将静态 IP 地址映射到应用。为了优化最终用户和 App Engine 应用之间的网络路径,处于不同 ISP 或地理位置的最终用户可以使用不同的 IP 地址来访问同一 App Engine 应用。DNS 可以返回不同的 IP 地址,以供在不同时间或从不同网络位置访问 App Engine。

出站服务(例如,网址提取、套接字和邮件 API 服务)使用大型 IP 地址池。此池中的 IP 地址范围可能会进行日常更改。实际上,来自同一应用的两个连续 API 调用可能看上去源于两个不同的 IP 地址。

App Engine 的当前传出 IP 地址范围会在 _cloud-netblocks.googleusercontent.com 的发件人政策框架 (SPF) 记录中进行编码。您可能需要以递归方式执行 DNS SPF 查找,以便解析整个 IP 范围列表。首先按以下方式解析 _cloud-netblocks.googleusercontent.com

nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8

此命令返回的响应将包含 App Engine 的所有当前 _cloud-netblocks。(请记住,这些结果并非静态:Google 可能随时引入新的 _cloud-netblocks 条目。)例如,此查询可能返回以下内容:

Non-authoritative answer:
_cloud-netblocks.googleusercontent.com	text = "v=spf1 include:_cloud-netblocks1.googleusercontent.com include:_cloud-netblocks2.googleusercontent.com include:_cloud-netblocks3.googleusercontent.com ?all

在此查询响应中,您可以查询响应中返回并列出的各个 _cloud-netblocksN。借助上一个包含三个 _cloud-netblocksN 条目的示例响应,您可以执行以下三个查询来查找所有 IP 范围:

nslookup -q=TXT _cloud-netblocks1.googleusercontent.com 8.8.8.8
nslookup -q=TXT _cloud-netblocks2.googleusercontent.com 8.8.8.8
nslookup -q=TXT _cloud-netblocks3.googleusercontent.com 8.8.8.8

对上述每个条目执行查询时,返回的 SPF 记录将是 IP 范围且可用于 App Engine 传出流量。例如,上述 _cloud-netblocks1 查询可能返回以下内容:

Non-authoritative answer:
_cloud-netblocks1.googleusercontent.com	text = "v=spf1 ip4:8.34.208.0/20 ip4:8.35.192.0/21 ip4:8.35.200.0/23 ip4:108.59.80.0/20 ip4:108.170.192.0/20 ip4:108.170.208.0/21 ip4:108.170.216.0/22 ip4:108.170.220.0/23 ip4:108.170.222.0/24 ?all"

在此示例中,我们看到 8.34.208.0/208.35.192.0/21 IP 范围都可用于 App Engine 流量。

请注意,使用静态 IP 地址过滤不算是安全有效的保护手段。例如,攻击者可以设置与您的应用共享相同 IP 地址范围的恶意 App Engine 应用。我们建议您使用 OAuth证书执行深度防御

我可以使用专用 IP 地址访问我的 App Engine 实例吗?

App Engine 将您的服务托管在 Google 负载平衡器的动态公共 IP 地址上。您无法使用专用 (RFC 1918) IP 地址访问您的服务。

如何为我的应用定义 Cron 作业?

如需了解如何为您的应用定义 Cron 作业,请参阅特定语言版本的文档 (Java | Python | Go | PHP)。

什么是任务队列?

任务队列为动态添加要在稍后完成的新请求提供了一种机制。如果应用需要执行某一后台工作,则它可以使用 Task Queue API 将该工作整理成小型离散单元(称为“任务”)。任务将被插入一个或多个队列中。App Engine 会自动检测新任务,并在系统资源允许的情况下执行这些任务。如需了解详情,请参阅 Task Queue API 文档 (Java | Python | Go | PHP)。

我可以使用 Google 群组授予对我的 App Engine 项目的访问权限吗?

如果您将某 Google 群组添加到 App Engine 项目中,该群组的成员将可以访问相应项目的资源,例如,数据存储区、任务队列、Memcache 等。

如何阻止用户/子网访问我的应用?

App Engine 提供一项 DoS 防护服务,可让您将 IP 地址或子网列入黑名单。如需了解详情,请参阅 DoS 防护服务文档 (Java | Python | Go | PHP)。

如何详细了解应用的中断和可访问性问题?

Google Cloud 状态信息中心提供有关 Google Cloud Platform 中的服务的状态信息。

对于中国区域的用户来说,App Engine 的可访问性可能是间歇性的。如需了解其他 Google 产品在中国区域的可访问性问题,请参阅 Google 透明度报告

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
App Engine 文档