基于 URL 某些组件的 HTTPS 负载平衡

基于 URL 某些组件的 HTTPS 负载平衡

我们有一个现有的应用程序,希望将其拆分到多台服务器上(例如:总共 1000 个用户,100 个用户拆分到 10 台服务器上)。

理想情况下,我们希望能够根据 URL 的某些部分将 HTTPS 请求转发到特定服务器。例如:用户 1 到 100 转到http://server1.domain.com/ 用户 2 至 200 转到http://server2.domain.com/ 等等等等等等

传入请求如下所示: https://secure.domain.com/用户/{整数用户 # 在此处输入}/path/to/file

有人知道一个简单的方法可以做到这一点吗?看起来很有希望......但它看起来不支持像这样基于 URL 的路由。

如果它不需要硬编码就更好了 - 负载平衡器可以向另一台服务器发出单独的 HTTP 请求以询问“嘿,我应该将对 URL {请求的 URL 在此处} 的请求中继到哪个服务器?” 并中继到 HTTP 响应中返回的主机名。

答案1

可以使用 URL 重写器来实现乌贼- 请注意,你需要在代理前终止 SSL(例如隧道)。

答案2

可能会这样做。与此处提到的其他选项一样,您需要在它前面添加类似井号的东西来充当 SSL 终止符。但是,一旦完成,您可以将每个真实服务器设置为“后端”,然后在配置中添加类似以下内容:

## 定义后端服务器。
后端服务器01 {
    .主机 = “192.0.2.1”;
    .端口 = “80”;
}
后端服务器02 {
    .主机 = “192.0.2.2”;
    .端口 = “80”;
}

子vcl_recv{
    如果(req.url〜“ ^ / 1 [0-9] [0-9] /”){
        ## 如果链接的第一部分是 100-199,则使用 server01
        设置req.backend = server01;
        管道;
    } 否则,如果 (req.url ~ "^/2[0-9][0-9]/") {
        ## 如果链接的第一部分是 200-299,则使用 server02
        设置req.backend = server02;
        管道;
    } 别的 {
        ## 如果其他方法都失败,则返回到 server01
        设置req.backend = server01;
        管道;
    }
}

这只是相关部分的摘录,配置中可能还需要更多内容。例如,您可以在后面添加以下内容,sub vcl_recv {以便缓存任何静态文件,这样服务器就不会每次都因为不变的文件而受到攻击。

如果 (req.request == "GET" && req.url ~ "\.(png|jpg|gif|css)$") {
        抬头;

您甚至可以在配置中添加小型内联 C 程序来与外部服务对话并决定使用哪个后端。

答案3

您有可用的编码资源吗?我使用中间服务器上的一个小程序几乎完全做到了这一点。它从 URI 中提取用户 ID,进行 DB 查找以找到其文件的位置,获取文件,然后将其写回给用户。我使用 Java servlet 做到了这一点,但还有很多其他选项可以完成同样的事情。

答案4

类似的事情可以通过 nginx 实现。Nginx 可以执行 SSL 终止,然后将您的请求代理到后端。

您的要求是否明确要求 1-100 个用户访问特定的 Web 服务器,还是请求可以均匀分布?我建议您均匀分布。这样可以帮助您分散,从而降低风险。

相关内容