我的服务器分布在多个数据中心,每个数据中心都存储不同的文件。我希望用户能够通过单个域访问所有服务器上的文件,并让各个服务器直接将文件返回给用户。
以下是一个简单的例子:
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返回给用户而不通过服务器A.
注意:步骤4和5必须对用户透明,并且不能涉及向用户发送重定向,因为这会违反单个域的要求。
从我的研究中,我想要实现的是“直接服务器返回”,它是负载平衡的常见设置。它有时也被称为半反向代理。
对于第4步,听起来我需要进行MAC地址转换,然后将请求传回网络,对于服务器网络外的服务器,将需要进行隧道传输。
对于步骤5,我只需要根据负载平衡设置中的真实服务器配置服务器B.也就是说,服务器B应该在环回接口上具有服务器A的IP地址,并且它不应该回答该IP地址的任何ARP请求。
我的问题是如何实际实现第4步?
我发现有很多硬件和软件可以在第4层进行简单的负载平衡,但这些解决方案不足,无法处理我需要的那种自定义路由。好像我需要推出自己的解决方案。
理想情况下,我想在Web服务器级别进行路由/转发,即在PHP或C#/ ASP.net中。但是,我愿意在较低级别(如Apache或IIS)或更低级别(即所有内容之前的自定义代理服务)执行此操作。
答案 0 :(得分:1)
请原谅我的无知,但为什么不设置服务器A来安装位于其他服务器上的文件,这些文件可以通过NFS或SMB,具体取决于您使用的是unix变体,还是使用的是Windows? / p>
似乎你正在尝试做的事情过于复杂,这可能非常简单。此外,使用网络安装文件将允许您在将来需要时将这些文件安装在其他计算机上。此时,您可以将负载均衡器放在服务器A(以及服务器x,y和z,服务器B,也是服务器B的所有文件)前面。
当然这不能解决在返回时绕过服务器A的问题,技术上服务器A将返回文件而不是服务器B,但如果负载均衡器要放在A前面,则A将成为B无论如何,技术上B仍然会返回文件,因为负载均衡器会使用直接服务器返回(现在很长一段时间它是标准功能)。
如果我错过了什么,请详细说明。
编辑:是的我意识到这是近3年前发布的。哦,好吧。
答案 1 :(得分:0)
为什么不发送状态码307临时重定向的HTTP响应?
此时,客户端将重新请求正确的指定服务器。
我知道您想要一个域名,但您可以同时拥有单个子域名和一个公共域名。
例如:
example.com
具有IP1,IP2,IP3。
example1.example.com
有IP1
example2.example.com
有IP2
example3.example.com
有IP3
如果请求到达无法自行处理的服务器,它将转发用户向正确的特定服务器发出另一个请求。顺便说一句,HTTP浏览器将透明地遵循此重定向。