无法在其他控制器中使用Varnish控制器

无法在其他控制器中使用Varnish控制器,varnish,varnish-vcl,Varnish,Varnish Vcl,我正在尝试嵌套Varnish directors,但它在4.1.10或6.4中不起作用,尽管在多个地方提到了它 我有两个随机控制器,我想将它们添加到备用控制器中,如下所示: vcl 4.0; import directors; backend alpha { .host = "192.168.0.101"; } backend bravo { .host = "192.168.0.102"; } sub vcl_init { new prima

我正在尝试嵌套Varnish directors,但它在4.1.10或6.4中不起作用,尽管在多个地方提到了它

我有两个随机控制器,我想将它们添加到备用控制器中,如下所示:

vcl 4.0;

import directors;
backend alpha { .host = "192.168.0.101"; }
backend bravo { .host = "192.168.0.102"; }

sub vcl_init {
    new primary_director = directors.random();
    primary_director.add_backend(alpha, 1.0);

    new secondary_director = directors.random();
    secondary_director.add_backend(bravo, 1.0);

    new fallback_director = directors.fallback();
    fallback_director.add_backend(primary_director);
    fallback_director.add_backend(secondary_director);
}
专家组支持这种情况:

请注意,控制器可以使用其他控制器作为后端

知道我做错了什么吗

您可以通过将上面的代码段保存为
/tmp/test.vcl
并在Docker中运行varnish来测试它:

$ docker run -v /tmp/test.vcl:/test.vcl --rm varnish:6.4 varnishd -F -f /test.vcl
Error:
Message from VCC-compiler:
Expression has type INSTANCE, expected BACKEND
('/test.vcl' Line 15 Pos 35) -- (Pos 50)
    fallback_director.add_backend(primary_director);
----------------------------------################--

Expected argument: BACKEND (unnamed argument)

While compiling function call:

('/test.vcl' Line 15 Pos 5) -- (Pos 50)
    fallback_director.add_backend(primary_director);
----##############################################--

Running VCC-compiler failed, exited with 2
VCL compilation failed

非常感谢Varnish IRC董事会的人——他们让我很快找到了答案

以下是我的示例的更正版本:

vcl 4.0;

import directors;
backend alpha { .host = "192.168.0.101"; }
backend bravo { .host = "192.168.0.102"; }

sub vcl_init {
    new primary_director = directors.random();
    primary_director.add_backend(alpha, 1.0);

    new secondary_director = directors.random();
    secondary_director.add_backend(bravo, 1.0);

    new fallback_director = directors.fallback();
    fallback_director.add_backend(primary_director.backend());
    fallback_director.add_backend(secondary_director.backend());
}

sub vcl_recv {
    set req.backend_hint = fallback_director.backend();
}
这里的要点是:

  • 正确的语法是
    fallback\u director.add\u backend(primary\u director.backend())
  • 没有
    set req.backend\u hint=fallback\u director.backend(),Varnish将使用定义的第一个后端