可以使用Varnish 4 round_robin director在404上重试下一个服务器

时间:2017-02-28 12:04:51

标签: varnish varnish-vcl varnish-4

我知道这个主题有很多问题和答案。但其中大多数是Varnish 3或不使用round_robin导演。

  • 我在Varnish中配置了2个网络服务器。
  • 某些静态文件只能在两个网络服务器之一生成。
  • 在404响应中,我希望varnish尝试其他网络服务器。

目前我已使用以下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);
    }
}

1 个答案:

答案 0 :(得分:1)

我认为它因你的循环而在你的测试中起作用。它会一个接一个地尝试服务器。

我认为在生产设置中,由于并发请求,这将无效。

如果你重试,它将再次通过vcl_recv并从导演获得backend_hint,无论req.restarts值是什么。如果你想要一个不同的后端,那么你将不得不对其进行编码。

一个想法可能是(代码未经过测试,您将不得不调整X-backend比较):

subprocess.Popen