我知道这个主题有很多问题和答案。但是其中大多数是用于清漆3或不使用Round_robin主管。
- 我有2个在清漆中配置的网络服务器。
- 某些静态文件只能在两个Web服务器之一生成。
- 在404响应中,我希望Varnish尝试其他Web服务器。
当前我已经对以下VCL进行了测试:
sub vcl_init {
new bar = directors.round_robin();
bar.add_backend(cbweb1);
bar.add_backend(cbweb2);
}
sub vcl_recv {
set req.backend_hint = bar.backend();
unset req.http.Cookie;
}
sub vcl_deliver {
if(resp.status == 404 && req.restarts < 1)
{
return(restart);
}
}
在我的小测试中,这似乎有效。但是我不明白这是如何工作的。
bar.backend()是否记得已经使用了哪些服务器并跳过了这些服务器?还是这只是全球圆形旋转,是否有可能,如果在处理过程中其他请求提出?
更新:以下VCL似乎有效:
sub vcl_init {
new bar = directors.round_robin();
bar.add_backend(cbweb1);
bar.add_backend(cbweb2);
}
sub vcl_recv {
set req.backend_hint = bar.backend();
}
sub vcl_backend_fetch
{
if (bereq.retries > 0)
{
if(bereq.http.X-Backend == "cbweb1")
{
set bereq.backend = cbweb2;
}
else
{
set bereq.backend = cbweb1;
}
}
}
sub vcl_backend_response {
set bereq.http.X-Backend = beresp.backend.name;
if (beresp.status == 404 && bereq.retries < 1) {
return(retry);
}
}
我认为它在您的测试中起作用,这是因为循环robin。它将互相尝试使用服务器。
我认为在制作设置中,这是由于并发请求而无法工作的。
如果您重试,它将再次通过VCL_RECV并从导演中获得后端_HINT,无论是req.restarts值,如果您想要不同的后端,则必须对其进行编码。
可能是一个想法(代码未测试,您必须调整X-backend比较):
sub vcl_init {
new bar = directors.round_robin();
bar.add_backend(cbweb1);
bar.add_backend(cbweb2);
}
sub vcl_recv {
if (req.restarts > 0){
if (req.X-backend == cbweb1 ){
set req.backend_hint = cbweb2;
}
if (req.X-backend == cbweb2 ){
set req.backend_hint = cbweb1;
}
}
else {
set req.backend_hint = bar.backend();
}
set req.X-backend = req.backend_hint
unset req.http.Cookie;
}
sub vcl_deliver {
if(resp.status == 404 && req.restarts < 1)
{
return(restart);
}
}