Cloud Run 中的 API 和 VM 中的 Nginx 反向代理
Posted
技术标签:
【中文标题】Cloud Run 中的 API 和 VM 中的 Nginx 反向代理【英文标题】:APIs in Cloud Run and Nginx reverse proxy in VM 【发布时间】:2020-10-04 12:22:28 【问题描述】:我已将 6 个不同的基于 Flask 的应用程序部署到 Google Cloud Run。当我通过自动生成的 URL 访问它们时,它们工作得很好。现在,我想将所有 6 种服务统一在一个具有不同路由的域名下。 例如, mydomain.com/user -> https://custom-user-asdtgthyju-de.a.run.app mydomain.com/product -> https://custom-product-asdtgthyju-de.a.run.app 我尝试过的事情1. Nginx 部署在单独的 VM 中,并通过反向代理到云运行 URL 不工作,在常规 VM 中部署的相同配置相同的代码可以工作,但对于云运行部署显示找不到路由“/user”
2。使用 ESPv2 的云端点https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-run 按照我的要求让它工作,但无法传递自定义标头,就像我使用 X-API-KEY 进行身份验证一样,它甚至没有进入 Cloud Run。它被 ESPv2 本身剥离。
请帮忙,我如何在云运行服务前配置反向代理/API 网关。有没有人尝试过外部 Nginx 到 Cloud Run 映射?
谢谢
【问题讨论】:
您能否包含您的 Cloud Endpoints 配置文件,以了解我们如何帮助其正常工作? 你终于找到办法了吗? @lewislbr 我遵循了 petomalina 的回答,我想这是唯一的方法 【参考方案1】:使用 URL 路由获取单个域的最简单方法是使用 Firebase Hosting and its's redirection to Cloud Run。您可以将您的域添加到 Firebase 托管,并根据其来源 (URL) 重定向到特定的 Cloud Run 服务。
【讨论】:
这是否真的做了超出标准 Cloud Run 已经做的事情?您可以直接在 Cloud Run 上使用自定义域,但当前版本不支持路径映射,因此您需要为每个服务创建一个子域。 NVM,我找到了它:firebase.google.com/docs/hosting/… 这可能确实符合您的要求。【参考方案2】:如果您的 Cloud Run 服务是公开的,@petomalina 的答案是最简单的。如果不是,它将无法按照this answer 工作
如果您的服务是 internal
,我尝试了 OP 的 #1 选项,即在前面放置一个 nginx 反向代理并得到相同的错误:404。
该问题是由 Host
标头具有代理的主机,而不是 Cloud Run 服务的主机引起的。修复方法是配置 nginx 以覆盖 Host 标头:
upstream my-foo
server foo.run.app:443;
location /foo/
proxy_pass https://my-foo;
proxy_set_header Host foo.run.app;
include /etc/nginx/proxy_params;
proxy_ssl_session_reuse on;
【讨论】:
以上是关于Cloud Run 中的 API 和 VM 中的 Nginx 反向代理的主要内容,如果未能解决你的问题,请参考以下文章
如何手动指定 X-Cloud-Trace-Context 标头值以关联和跟踪单独的 Cloud Run 请求中的日志?
如何访问 VM 实例中的存储桶数据 - Google ML Cloud
如何解决 Google Cloud [Compute Engine] 中的持续非活动计费状态并恢复暂停的 VM 实例?