使用直接服务器返回转发 HTTP 请求

6 http reverse-proxy forwarding

我的服务器分布在多个数据中心,每个数据中心存储不同的文件。我希望用户能够通过单个域访问所有服务器上的文件,并让各个服务器直接将文件返回给用户。

下面显示了一个简单的示例: 1) 用户的浏览器请求http://www.example.com/files/file1.zip 2) 根据 example.com 的 DNS A 记录,请求转到服务器 A。3) 服务器 A 分析请求并计算出 /files/file1.zip 存储在服务器 B 上。 4) 服务器 A 将请求转发到服务器 B。 5) 服务器 B 将 file1.zip 直接返回给用户,无需经过服务器一种。

注意:步骤 4 和 5 必须对用户透明,不能涉及向用户发送重定向,因为这会违反单个域的要求。

根据我的研究,我想要实现的称为“直接服务器返回”,它是负载平衡的常见设置。它有时也被称为半反向代理。

对于第 4 步,听起来我需要进行 MAC 地址转换,然后将请求传回网络,对于服务器网络之外的服务器,将需要隧道。

对于第 5 步,我只需要根据负载平衡设置中的真实服务器来配置服务器 B。即,服务器 B 应该在回送接口上拥有服务器 A 的 IP 地址,并且它不应该回答对该 IP 地址的任何 ARP 请求。

我的问题是如何实际实现第 4 步?

我发现有很多硬件和软件可以在第 4 层实现简单的负载平衡,但这些解决方案不够完善,无法处理我需要的那种自定义路由。看来我需要推出自己的解决方案。

理想情况下,我想在 Web 服务器级别进行路由/转发,即在 PHP 或 C#/ASP.net 中。但是,我愿意在较低级别(例如 Apache 或 IIS)或更低级别(即在所有内容之前使用自定义代理服务)执行此操作。

谢谢。

Yor*_*sar 0

我认为,您应该使用缓存代理服务器或 HTTP 重定向来实现您的目标。

例如,使用 nginx,您可以使用后端(PHP 脚本或某些 FastCGI 托管服务器)来确定您应该前往哪个“数据中心”,将 X-Accel-Redirect 返回到新位置,并使用 proxy_pass 到该数据中心。之后,nginx 应该缓存/存储你的结果。

因此,您在每个数据中心中的配置仅对于 100% 本地的文件会有所不同。

第二种情况 - 后端返回 301 错误代码以及必要的直接链接。