【问题标题】:Configuring a reverse-proxy-like Firebase Hosting solution配置类似反向代理的 Firebase 托管解决方案
【发布时间】:2020-02-21 04:19:50
【问题描述】:

这是我目前拥有的

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 托管的网站都有从冷启动开始的预热时间。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    3) 让 Express 使用 app.get 管理路由并使用 res.sendFile 提供文件。

    4) 按照 Google 的教程 here 将整个 Express 应用程序容器化,您可以忽略示例应用程序,因为您的新 Express 应用程序就是该应用程序。

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

    6) 使用 Google 域映射映射到您的 域,因此 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 域映射分别映射每个域。

    【讨论】:

    • 你的 firebase.json 看起来怎么样?
    • 我退出了那个项目,但我不认为我有一个。我用 Express 运行这个项目;我认为只有在使用 firebase 处理路由时才需要 firebase.json。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我知道我说过我不介意答案不完整,但我看到您在 Firebase 团队工作。首先,我想澄清一下我所读到的内容。简而言之,我将当前托管的两个站点都作为容器化图像上传到 Cloud Run(在将它们部署给用户时基本上充当 Firebase 托管),然后我使用 Firebase Cloud Functions 将图像路由给用户,对吗?其次,这有什么延迟/延迟? FCF 本身就有预热时间,Firebase Run 是否也有很长的预热时间?
    • 如果您有超出您最初提出的问题,请研究它们并作为不同的问题单独发布。网络延迟永远无法保证。
    • 我在这里列出了我的问题:stackoverflow.com/questions/58548947/…
    • 感谢 Doug 的帮助,我已经发布了让一切正常运行的步骤。
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多