【问题标题】:GCP - Deploy API and frontend on subdomain and domain respectivelyGCP - 分别在子域和域上部署 API 和前端
【发布时间】:2020-07-27 12:09:39
【问题描述】:

首先,我创建一个Google App Engine,并在我的自定义域(我们将其称为:mysite.ms)上部署 API 和前端。 API 用nodejsExpress 编写,前端是React 应用程序。这是我用于部署的 app.yml 文件:

runtime: nodejs
env: flex

manual_scaling:
  instances: 1

resources:
  cpu: .5
  memory_gb: 0.5
  disk_size_gb: 10

handlers:
  - url: /
    static_files: www/build/index.html
    upload: www/build/index.html

  - url: /
    static_dir: www/build

现在,我想要分离元素。在mysite.ms 域上仅部署React 应用程序,在子域sub.mysite.ms 上部署API。由于该域在 freenom 上被接管,为了创建一个子域,我添加了一个类型为 CNAME 的新 DNS,其值为 sub.mysite.ms,并以原始域 mysite.ms 为目标。

是否可以仅使用 Google App Engine 和单个 app.yml 文件来创建这些单独的部署,或者您是否需要使用其他工具来分离文件?

你建议我如何继续?由于我在网上找不到任何明确的内容,您能否给我一些解决这些问题的提示?

更新

我已阅读您提供给我的文档,对此我有些疑问。首先,如何创建不同的服务?因为我创建了这个(但很可能是错误的)dispatch.yml:

dispatch:
  - url: "mysite.ms/*"
    service: default

  - url: "sub.mysite.ms/*"
    service: api

但是当我使用这个命令gcloud app deploy dispatch.yaml 进行部署时,我收到一个错误,因为它找不到模块“api”。 在以前的版本中,在我的server.js 中,我有这段代码来处理React

app.use(express.static(path.resolve(__dirname, 'www', 'build')));
app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, 'www', 'build', 'index.html')); });
  1. 是否应该保留这两行代码,即使我将前端和 api 拆分在不同的域中?

  2. 我应该将sub.mysite.ms 添加到 Google App Engine 部分的自定义域区域吗?

  3. 即使我有dispath.yaml,我是否应该保留文件app.yml

【问题讨论】:

标签: node.js express google-app-engine google-cloud-platform


【解决方案1】:

目前,无法使用同一个yaml 文件部署多个服务。假设您可能想要部署两个服务:apifrontend。假设您希望将frontend 服务设为默认服务,这样每次每个人访问mysite.ms 时,他们都会看到frontend 服务。

假设您有app.yaml 文件,如下所示用于frontend 服务:

runtime: nodejs
env: flex

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

如您所见,app.yaml 中没有 service 属性。在app.yaml 文件reference doc 中,您将看到以下内容:

service: service_name

创建服务时需要。对于默认服务是可选的。每个服务和每个版本都必须有一个名称。名称可以包含数字、字母和连字符。在柔性环境中,服务和版本的组合长度不能超过 48 个字符,并且不能以连字符开头或结尾。为每个服务和每个版本选择一个唯一的名称。不要在服务和版本之间重复使用名称。

由于没有service 属性,部署将设置为default 服务。现在假设您有另一个yaml 文件,特别是api.yaml 来部署api 服务。这是一个例子:

runtime: nodejs
env: flex
service: api

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

您会看到我添加了service 属性,当您使用gcloud app deploy api.yaml 进行部署时,部署将创建服务api

最后,在创建服务后,您将能够部署您创建的dispatch.yaml 文件。

给你的一些建议:

  • app.yaml 文件分配给默认服务是一种很好的做法。对于其他服务,您可能需要根据要使用此类文件部署的服务来命名文件,即api.yamlbackend.yamlapi_external.yaml 等。
  • 您可以使用 gcloud app deploy path/to/service1 path/to/service2 path/to/service3 ... 部署部署这两个服务,也可以单独部署,以便在出现问题时更好地进行调试。
  • 由于您使用的是 Flex 环境,因此handlers 属性为not supported。如果您添加它们,它们将被忽略。
  • 检查您使用的环境的正确文档。 app.yamldispatch.yamlgeneral docs

【讨论】:

    猜你喜欢
    • 2021-01-06
    • 2019-08-21
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多