【问题标题】:Mapping subdomain to a service in Google App Engine project将子域映射到 Google App Engine 项目中的服务
【发布时间】:2017-04-06 23:31:27
【问题描述】:

我有一个带有以下 yaml 文件的 Google App Engine 项目

handlers:
- url: /web/.*
  script: web_server.app

- url: /api/.*
  script: rest_server.app

如何确保我拥有的域的子域由 rest_server.app 脚本提供服务。

示例:如果我拥有 example.com

我希望example.comweb_server.app 服务,api.example.comrest_server.app 服务

是否可以使用 Google App Engine 做到这一点。

例子:

handlers:
- url: example.com/.*
  script: web_server.app
- url: api.example.com/.*
  script: rest_server.app

【问题讨论】:

  • 澄清一下,您的 2 个脚本实际上并不是 GAE 服务(如帖子标题中所述),它们只是不同的 脚本您的应用程序的单一/default GAE 服务。您将在下面看到与我的回答的不同之处 - 解决方案 基于 GAE 服务。我刚刚注意到潜在的令人困惑的不一致:)

标签: google-app-engine subdomain google-domain-api


【解决方案1】:

app.yaml 中的请求路由不能用于基于 URL 的域名进行路由,请参阅Handlers element 文档部分中的url 表行。

因此,您不能真正让一个模块/服务为您的应用程序提供服务,同时剥离您当前在处理程序的url 配置中使用的 URL 的文件路径部分,以将请求路由到一个脚本或其他。

您可以通过将您的应用拆分为 2 个独立的services/modules,每个处理一个脚本来获得所需的内容。其中一个模块必须是默认模块,我会将web 设为默认模块。 dispatch.yaml 文件将用于根据 URL 主机名将请求路由到各自的模块。

web.yaml 文件将包含:

module: default

handlers:
- url: /.*
  script: web_server.app

rest.yaml 文件将包含:

module: rest

handlers:
- url: /.*
  script: rest_server.app

dispatch.yaml 文件中,您只需要非默认模块的路由,不匹配路由的请求默认路由到默认模块:

- url: "api.example.com/*"
  module: rest

您可以在此处找到更完整的示例:https://stackoverflow.com/a/34111170/4495081

然后,您将example.com 裸域api.example.com 子域 映射到您的应用。遵循Adding a custom domain for your application 过程,特别注意配置裸域与子域时略有不同的部分。另见https://stackoverflow.com/a/36317462/4495081

有一个问题,虽然 - 基于主机名的dispatch.yaml 路由不适用于本地开发服务器,发往rest 模块的请求实际上会转到@987654343 @ 模块。

一个更简单的解决方法是将rest 模块客户端定向到本地开发服务器的rest 模块侦听的实际localhost:PORT URL(在开发服务器启动时显示在终端中)。

可能不适用于所有情况或所有应用。例如,如果应用使用自动生成的 URL 发出跨模块请求,就会出现问题。

在这种情况下,要解决它,您可以临时在rest.yaml URL 中插入一个小路径部分,仅在本地开发服务器上测试rest 模块期间(您需要在客户端进行匹配更改和/或跨模块 URL 生成逻辑):

module: rest

handlers:
- url: /api/.*
  script: rest_server.app

然后您可以添加一个dispatch.yaml 规则,该规则不是基于主机的,也适用于本地开发服务器。这可以永久保留在那里,如果/在生产中部署时,当临时 rest.yaml 更改被逆转时,它不会受到伤害:

- url: "api.example.com/*"
  module: rest
- url: "*/api/*"
  module: rest

【讨论】:

  • 如何使用这种新结构进行部署。我试过gcloud app delpoy web.yaml rest.yaml,但没用。裸域和 api.* 子域都由 web.yaml 提供服务。现在,我正在尝试使用以下命令gcloud app deploy web.yaml rest.yaml dispatch.yaml 进行部署。而且这个日志语句之后需要很长时间并且没有任何进展。信息:上传 [/server/src/dispatch.yaml] 到 [899bc6aeea3e3615e45e54eefe593acf2065b6b3]
  • 看起来我的 dispatch.yaml 中有不必要的空格,导致gcloud app deploy 在上传 dispatch.yaml 时卡住。这样一个奇怪的问题(我能够重现它以确保它是导致问题的空间)。 gcloud app deploy web.yaml rest.yaml dispatch.yaml 工作!!谢谢!!!
  • 我想知道 dispatch.yaml 是否可以与 appengine flex 一起使用,我猜想知道了
  • @the0ther 是的,dispatch.yaml 是一个应用级配置,由所有应用的服务共享,而弹性与标准环境的选择是一个服务级配置(应用可以混合不同的服务语言和环境)。事实上,它也是为 flex 环境指定的:cloud.google.com/appengine/docs/flexible/python/…
  • 我认为在我在这里提出问题 5 分钟后,我搜索并登陆了 flex URL 下的 dispatch.yaml 文档。一样的感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多