App Engine 常见问题解答

如何登录 App Engine 帐号?

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

如何为 App Engine 创建 Cloud 项目?

使用 Google Cloud 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 使用记录。根据这些因素和其他因素,客户可能会获得不同的配额。

如果您尝试超出项目限额,Cloud 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 是否支持 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 证书时出现错误,则将引发 javax.net.ssl.SSLHandshakeException

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

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

如果您搭配 SSL 使用自定义网域,则还支持裸网域。

App Engine 服务的 IP 地址

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

如需查找 App Engine 用于出站流量的当前 IP 地址范围,请执行以下操作:

  1. 在命令 Shell 中,输入以下命令:
    nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8

    响应包含 App Engine 的所有当前 _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 include:_cloud-netblocks4.googleusercontent.com include:_cloud-netblocks5.googleusercontent.com ?all"

    这些结果并非静态。输入该命令后,您看到的网络地址段可能多于或少于上述示例。

  2. 对于响应中列出的每个网络地址段,输入以下查询:
    nslookup -q=TXT netblock-name 8.8.8.8

    例如,如果前一个查询返回了五个网络地址段,那么您将进行以下五个查询:

    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
    nslookup -q=TXT _cloud-netblocks4.googleusercontent.com 8.8.8.8
    nslookup -q=TXT _cloud-netblocks5.googleusercontent.com 8.8.8.8

针对特定网络地址段进行的每个查询都会返回一个 IP 范围,您可以将其用于 App Engine 传出流量。例如,上面的 _cloud-netblocks1 查询可能会返回以下内容:

Non-authoritative answer:
_cloud-netblocks1.googleusercontent.com	text = "v=spf1 include:_cloud-netblocks6.googleusercontent.com include:_cloud-netblocks7.googleusercontent.com ip6:2600:1900::/35 ip4:8.34.208.0/20 ip4:8.35.192.0/21 ip4:8.35.200.0/23 ip4:23.236.48.0/20 ip4:23.251.128.0/19 ip4:34.64.0.0/11 ip4:34.96.0.0/14 ?all"

在此示例中,我们看到 8.34.208.0/208.35.192.0/21 IP 范围都可用于 App Engine 流量。针对任何其他网络地址段进行的其他查询可能会返回其他 IP 范围。

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

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

App Engine 本身不提供将静态 IP 地址映射到应用的方法。但是,您可以使用 Cloud Load Balancing 和无服务器 NEG 为负载平衡器预留静态 IP 地址,然后该 IP 地址将流量定向到您的应用。如需了解价格,请参阅外部 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 透明度报告