我们有一个现有的应用程序,我们希望跨多个服务器(例如:总共1000个用户,100个用户分布在10个服务器)。
理想情况下,我们希望能够根据URL的某个组件将HTTPS请求转发给特定的服务器。 例如:用户1到100转到http://server1.domain.com/用户2到200转到http://server2.domain.com/等。
传入的请求看起来像这样: https : //secure.domain.com/user/ {整数用户#在这里} /path/到/文件
有谁知道一个简单的方法来做到这一点? 庞德看起来很有前途…但是看起来好像它不支持像这样的基于URL的路由。
如果不需要硬编码,甚至更好 – 负载均衡器可以向另一个服务器发出一个单独的HTTP请求,询问“嗨,我应该中继到什么服务器来请求URL(请求的URL去这里}? 并转发到HTTP响应中返回的主机名。
清漆可能会做到这一点。 就像在这里提到的其他选项一样,你需要在它之前像磅一样的行为作为一个SSL终结者。 但是,一旦完成,您可以将每个真实的服务器设置为“后端”,然后在config中添加如下内容:
##定义后端服务器。
后端server01 {
.host =“192.0.2.1”;
.port =“80”;
}
后端server02 {
.host =“192.0.2.2”;
.port =“80”;
}
sub vcl_recv {
if(req.url〜“^ / 1 [0-9] [0-9] /”){
##如果链接的第一部分是100-199,则使用server01
设置req.backend = server01;
pipe;
} else if(req.url〜“^ / 2 [0-9] [0-9] /”){
##如果链接的第一部分是200-299,则使用server02
设置req.backend = server02;
pipe;
} else {
##如果一切都失败回落到server01
设置req.backend = server01;
pipe;
}
}
这只是相关部分的摘录,在configuration中可能会有更多的需求。 例如你可以在sub vcl_recv {之后添加下面的内容sub vcl_recv {为了caching任何静态文件,以便服务器不会每次都find不变的文件。
if(req.request ==“GET”&& req.url〜“\。(png | jpg | gif | css)$”){
抬头;
您甚至可以在configuration中添加一些内联C程序,与外部服务进行通信并决定使用哪个后端。
用squid中的URL重写器做这件事是可行的 – 注意你需要终止代理之前的SSL(例如stunnel )。
你有编码资源吗? 我已经用中间服务器上的一个小程序完成了这个工作。 它从URI中提取用户标识,进行数据库查找以查找其文件的位置,获取文件,然后将其写回用户。 我使用Java servlet来完成,但还有很多其他选项可以完成同样的任务。
HAProxy会做你所要求的。 它具有根据URL内容进行第7层路由的能力,它是开源的。
类似的事情可以用nginx来实现。 Nginx可以执行SSL终止,然后将您的请求代理到后端。
你的需求是特定的,用户1-100应该去一个特定的networking服务器或请求均匀分布? 我会build议你平均分配他们。 会帮助你传播,从而降低你的风险。