如何在 Google Cloud Run 中配置 nginx 反向代理以指向不同的 Google Cloud Run 应用

ist*_*pin 2 nginx google-cloud-platform nginx-reverse-proxy google-cloud-run

我在 GCP Cloud Run 中设置了一个以 nginx 为前端的 Web 应用程序,效果非常好。我正在尝试使用 nginx 将请求代理到另一个 GCP Cloud Run 服务的特定路由。例如,我希望请求能够https://my-cloud-run-frontend.app.run解析到https://my-cloud-run-frontend.run.app,但是我希望请求能够 https://my-cloud-run-frontend.run.run/api/*被代理https://my-cloud-run-backend.run.app

这两个云运行服务都使用 IAM Auth。

当我在本地 docker 容器中运行服务时,代理效果很好。同样,如果我frontend在 Cloud Run 设置中从应用程序中删除 IAM 身份验证,一切似乎都会正常。

但是,启用 IAM 身份验证后,请求会https://my-cloud-run-frontend.run.app成功,但请求会https://my-cloud-run-frontend.run.app/api/因未经授权而失败(具体来说,错误是从frontend云运行应用程序引发的)。

https://my-cloud-run-backend.run.app我已经确认,通过使用相同的身份验证令牌并直接向 和发出请求https://my-cloud-run-frontend.run.app,身份验证可以正常工作,并且工作正常。

做了一些研究,我发现我可能需要设置一个Host标头,所以我尝试将标头设置Host为我的目的地(https://my-cloud-run-backend.run.app网址)。这会导致调用返回https://my-cloud-run-frontend.run.app/api400 错误。

我的nginx.conf.template文件:

server {

  access_log /dev/stdout;
  listen 8080;

  location / {

    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;
    proxy_pass_request_headers on;

  }

  location /api/ {
    proxy_pass https://my-cloud-run-backend.run.app/;
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;
    proxy_set_header Host https://my-cloud-run-backend.run.app;
    proxy_pass_request_headers on;
    rewrite ^/api(.*)$ $1 break;
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}
Run Code Online (Sandbox Code Playgroud)

gui*_*ere 7

您无需在后端进行身份验证即可实现您的用例。事实上,您可以部署未经身份验证的 API Cloud Run,但将入口设置为仅限内部

然后,在反向代理 Cloud Run 上,您必须添加无服务器 VPC 连接器并将出口设置为所有

该设计仅接受反向代理上经过身份验证和授权的请求,并使 API 后端只能由反向代理(或 VPC 中的其他内部资源)访问。


这种设计可行,但需要权衡一些:

  • 您无法定义谁有权访问您的 API 后端。它是“内部的”:项目中的任何内部资源都可以访问它。此外,如果您有权访问反向代理,您也可以访问后端,但这里不可能有不同级别的授权(至少对于 Google Cloud 服务而言是这样。您可以在代码中添加自制授权检查)
  • 无服务器 VPC 连接器成本高于负载均衡器
  • 设计很复杂,仅用于重定向