我有两个Varnish服务器,位于F5负载均衡器和两个应用服务器(Apache httpd)之间的中间层。我希望Varnish在两台Apache服务器之间或多或少地平均分配负载。以下是我使用的配置中的重要部分:
backend prod1 {
.host = "172.16.1.1";
.port = "80";
}
backend prod2 {
.host = "172.16.2.1";
.port = "80";
}
director wpprod client {
{ .backend = "prod1"; .weight = 1; }
{ .backend = "prod2"; .weight = 1; }
}
sub vcl_recv {
set client.identity = req.http.user-agent;
set req.backend = wpprod;
}
目的是获取在会话期间不应更改的标头,但应该是半随机的(客户端的User-Agent:标头),并使用它来分割负载之间的负载。两个后端服务器。
不幸的是,在实践中,负载正在被分成大约70-30,其中一个后端的流量大约是另一个后端的两倍。
我还尝试使用我的F5添加的X-Forwarded-For:标题作为client.identity,但遇到了同样的问题。
我可以稍微调整一下权重,以尝试均衡负载,但这不是真正可扩展的,或者对于多个服务器来说是可行的。
我可以使用哪些关于标题的建议会导致更均匀的流量分割?
答案 0 :(得分:0)
假设您正在使用Varnish 3.x并假设您需要某种粘性(否则您可以使用随机或循环导演),您可以使用client.identity
填充client.ip
,或者,更好的是,您可以生成/使用自己的cookie将每个客户分配给一个组:
...
sub vcl_recv {
cookie.parse(req.http.Cookie);
unset req.http.X-Group;
if (cookie.get("group")) {
set client.identity = cookie.get("group");
} else {
set req.http.X-Group = std.random(1, 1000);
set client.identity = req.http.X-Group;
}
set req.backend = wpprod;
}
sub vcl_deliver {
if (req.http.X-Group) {
header.append(
resp.http.Set-Cookie,
"group=" + req.http.X-Group + "; domain=.example.com; path=/; expires=" + cookie.format_rfc1123(now, 365d));
}
}
答案 1 :(得分:0)
我没有足够好的声誉来发表评论,这是一个相当古老的话题,而且 v3 更老,我不应该这样回答,但 Google 提供了这个,并且评论client.ip
不准确。>
当然,client.ip
是在代理后面工作的。
代理必须为该客户端的 IP 设置标头,例如在 Nginx 中:
proxy_set_header X-Real-IP $remote_addr;
必须转换成有用的字符串来代替client.ip:
std.ip(req.http.X-Real-IP, "0.0.0.0"));
其中 0.0.0.0 只是后备。
在 Varnish 中使用 cookie 是一个很奇怪的选择。