GCP 负载均衡(非经典)- URL 重写

fun*_*der 3 load-balancing node.js google-cloud-platform gcp-load-balancer angular14

我有一个非常简单的用例,但我似乎找不到方法来做到这一点。我的应用程序有一个应用程序部分(角度)和一个 API 部分(nodejs)。从 UI 来看,虽然我将 api 称为/api/*,但 api 服务器本身没有/api前缀。因此,我需要重写对/apito的任何请求/

在开发环境中,我的角度应用程序只有一个代理配置来进行重写:

{
  "/api/*": {
    "target": "http://localhost:3000",
    "pathRewrite": {
      "^/api/": ""
    },
    "secure": false,
    "logLevel": "debug"
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于生产环境,我需要针对以下场景配置GCP负载均衡器:

传入路径 后端服务 路径重写
/ ui 后端服务 (不适用)
/应用程序 ui后端服务 (不适用)
/api api 后端服务 /

虽然我能够配置简单的路由规则来将主机和路径映射到 ui-backend-service,但重写/api.

我能找到的任何 URL 重写示例都显示了经典负载平衡,它似乎不再适用。

我尝试修改Advanced host and path rules,但它告诉我我可以提供pathRulesrouteRules,而不是两者都提供。我无法创建单独的规则,因为主机(*在我的例子中)不能多次使用。

我不想为此在我的 api 服务器上设置 nginx。还有其他方法吗?

fun*_*der 5

我终于设法解决了我的问题。

显然,GCP Console for Load Balancing的Web UI尚不支持让用户通过表单添加重写规则的方法。唯一的方法是手动添加配置。

我发现有两种方法可以做到这一点:

(此答案假设您已经创建了负载平衡配置)

1. 控制台

  1. 编辑 HTTP(S) 负载均衡器
  2. 添加前端和后端配置
  3. 在路由规则中,Advanced host and path rules在为规则提供的文本区域中选择并添加以下内容:
defaultService: projects/my-project/global/backendServices/ui-backend-service
name: path-matcher-1
pathRules:
- paths:
  - /
  service: projects/my-project/global/backendServices/ui-backend-service
- paths:
  - /app
  - /app/*
  service: projects/my-project/global/backendServices/ui-backend-service
- paths:
  - /api
  - /api/*
  service: projects/my-project/global/backendServices/api-backend-service
  routeAction:
    urlRewrite:
      pathPrefixRewrite: /
Run Code Online (Sandbox Code Playgroud)

2. 云云

gcloud compute url-maps edit <lb-name>
Run Code Online (Sandbox Code Playgroud)

这将检索负载平衡配置并在编辑器中显示它(在 Linux 中,它在终端的 vi 编辑器中显示它)

注释掉(通过放置#在每行的开头)或删除现有配置。在 vi 编辑器中插入上述配置(进行一些更改,如下所述)以代替注释掉或删除的行。

通过gcloud更新配置时,需要使用URI引用后端服务。因此,只需https://www.googleapis.com/compute/v1/在每个服务引用之前添加即可。

配置应类似于下图所示:

defaultService: https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/ui-backend-service
name: path-matcher-1
pathRules:
- paths:
  - /app
  - /app/*
  service: https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/ui-backend-service
- paths:
  - /
  service: https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/ui-backend-service
- paths:
  - /api
  - /api/*
  service: https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/api-backend-service
  routeAction:
    urlRewrite:
      pathPrefixRewrite: /
Run Code Online (Sandbox Code Playgroud)

请记住,对负载平衡配置的任何更改通常需要几分钟才能生效。因此,请耐心等待并尝试相应的更改。

灵感https://cloud.google.com/load-balancing/docs/https/setting-up-url-rewrite#gcloud

在上面的“鼓舞人心”链接中,该Console版本似乎已经过时(在撰写此答案时)。gcloud不过,该版本运行良好。