可以使用404上的下一个服务器重试下级服务器



我知道这个主题有很多问题和答案。但是其中大多数是用于清漆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);
    }
}

相关内容

最新更新