我们有一个现有的应用程序,希望将其拆分到多台服务器上(例如:总共 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
答案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 服务器,还是请求可以均匀分布?我建议您均匀分布。这样可以帮助您分散,从而降低风险。