配置类似反向代理的Firebase托管解决方案

时间:2019-10-24 19:21:51

标签: firebase proxy google-cloud-functions reverse-proxy firebase-hosting

这是我目前拥有的

domain.com ->  website A with its own firebase host (domain.firebase.com)
me.domain.com -> website B with its own firebase host (domain-me.firebase.com)

这并不难设置,只需将多个子域重定向到不同的Firebase主机即可。现在,我想要是一个反向代理,它接受请求并可以选择将流量路由到各种服务器,同时将客户端URL仅保留在 domain.com 的主域中>。我不确定在 Firebase中是否可以实现,因为有大量的NGINX实现示例,但是基本上,我想要这样做:

domain.com/ ->  website A with its own firebase host (domain.firebase.com)
domain.com/me -> website B with its own firebase host (domain-me.firebase.com)

Firebase具有非常复杂的重定向选项,但是重定向也会覆盖客户端URL。因此,通过重定向,客户端将看到 domain-me.firebase.com 而不是 domain.com/me ,这不是我想要的。

据我所知,我可以使用Firebase Cloud函数作为中间件,并根据需要使它服务于任一站点。但是,由于Cloud功能和Firebase托管网站都具有从冷启动开始的预热时间,因此引入了很多延迟。

不给我完整而详细的答案是完全可以的,我真的只是想知道这是否有可能开始,以及在哪里可以找到相关的资源。谢谢!

2 个答案:

答案 0 :(得分:0)

Cloud FunctionsCloud Run的集成在这里几乎是您唯一的选择。配置中没有任何内容可以让您直接将请求代理到其他端点,而不是通过HTTP redirects间接代理。

答案 1 :(得分:0)

回答我自己的问题,并以Doug使用Cloud Run的回答为基础。有一种快速而轻松的方法可以通过2个应用来设置类似反向代理的实现。为此:

1)生成这两个应用程序,并将它们放在单独的文件夹中,例如文件夹A和文件夹B。您只需要应用程序的生成文件夹,不需要源代码。 < / p>

2)在文件夹A和B的根目录下创建一个新的Express应用。

3)让Express使用app.get管理路由,并使用res.sendFile将文件送回。

4)按照Google的教程here将整个Express应用容器化,由于新的Express应用应用,因此您可以忽略示例应用。

5)作为新服务上传到Cloud Run。请记住,虽然未指定Google tut,但您需要授予用户上传到存储分区的权限。您将需要以下命令 gsutil iam ch user:[user]:objectViewer gs://us.artifacts.[project-name].appspot.com 如果您有多个项目,还请确保使用命令gcloud config set project [project-name]切换到当前项目。

6)使用Google域映射来映射到您的 root 域,因此domain.com

必须使用域映射,因为Cloud Run所使用的URL是短暂的……因为它没有服务器。

您的文件夹结构应类似于

my-awesome-project
    index.js <- Express app and Docker entry point
    /package.json <- for your Express app
    /A
    /B
    /Dockerfile
    /node_modules

示例路由器为

app.get('/me/*', (req,res) =>{
    res.sendFile(path.join(__dirname+'/B/index.html'));
});

app.get('/*', (req,res) =>{
    res.sendFile(path.join(__dirname+'/A/index.html'));
});

相反,在子域上设置应用程序的工作方式几乎相同。使用第4步对每个单独的应用进行容器化,然后使用Google Domain Mapping分别映射每个域。