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 实例?

Spring Cloud 整合 SkyWalking

如何在 docker 中的节点前为 Cloud Run 设置 nginx?

Cloud Composer 无法连接到安装在 Azure VM 中的 SQL Server 数据库