【问题标题】:Unable to use Varnish director in another director无法在另一个导演中使用清漆导演
【发布时间】:2020-07-14 07:01:00
【问题描述】:

我正在尝试嵌套 Varnish 导演,但它在 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);
}

official documentation 支持这种情况:

注意,directors 可以使用其他 director 作为后端

知道我在这里做错了什么吗?

您可以通过将上面的 sn-p 保存为 /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 varnish-vcl


    【解决方案1】:

    非常感谢 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();
    }
    

    这里的重点是:

    1. 正确的语法是fallback_director.add_backend(primary_director.backend());
    2. 没有set req.backend_hint = fallback_director.backend();,Varnish 将使用定义的第一个后端。

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 2016-10-12
      • 2015-06-20
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2020-03-30
      • 2014-04-25
      相关资源
      最近更新 更多