基于URL的某个组件的HTTPS负载均衡

我们有一个现有的应用程序,我们希望跨多个服务器(例如:总共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议你平均分配他们。 会帮助你传播,从而降低你的风险。