我有两个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,一个后端获得的流量大约是另一个后端的两倍。
我还尝试使用X-Forwarded-For:报头,它是我的F5s添加的client.identity,但也遇到了同样的问题。
我可以稍微调整一下权重,试图平衡负载,但这并不是真正的可伸缩性,或者在多台服务器上是可行的。
对于我可以使用的报头,有什么建议可以让流量更均匀地分配吗?
发布于 2016-09-26 22:47:38
假设您使用的是Varnish3.x,并且还假设您在这里需要某种粘性(否则您可以使用随机或循环控制器),您可以使用client.ip填充client.identity,或者,更好的做法是,您可以生成/使用自己的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));
}
}发布于 2021-06-23 04:29:23
我没有足够好的声誉来评论,这是一个相当老的话题,加上v3甚至更老,我不应该这样回答,但谷歌提供的这个和关于client.ipos的评论是不准确的。
当然,在某种程度上,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来实现这一点是相当奇怪的选择。
https://stackoverflow.com/questions/39703902
复制相似问题