Varnish VCL:如何打开req.backend_hint?

时间:2017-04-11 23:13:39

标签: varnish varnish-vcl varnish-4

我有以下VCL:

vcl 4.0;

import std;
import directors;

backend one {
    .host = "localhost";
    .port = "3333";
}

backend two {
    .host = "localhost";
    .port = "3333";
}

sub vcl_init {
    new random_director = directors.random();
    random_director.add_backend(two, 10);
    random_director.add_backend(one, 8);
}

sub vcl_recv {

    std.log("start vcl_recv");

    set req.backend_hint = random_director.backend();
    if (req.backend_hint == one) {
        std.log("one");
    } else if (req.backend_hint == two) {
        std.log("two");
    } else {
        std.log("neither one");
    }

    std.log("end vcl_recv");
}

当我运行它时,输出始终是:

start vl_recv
neither one
end vcl_recv

如何正确检查以查看选择了哪个后端?

由于

2 个答案:

答案 0 :(得分:1)

vcl_backend_fetch中,您应该可以访问bereq.backend.name

因此,移动代码可能会有:

sub vcl_backend_fetch {
    if (bereq.backend.name == "one") {
       std.log("one");
    } else if (bereq.backend.name == "two") {
       std.log("two");
    } else {
       std.log("neither one");
    }
}

答案 1 :(得分:0)

更新:在请求后端呼叫之前无法知道所选的后端,因此您永远不会在vcl_recv中获取此信息。因为您可能不需要后端选择(如果对象已经在缓存中),或者因为后端可能在运行选择之前发生更改(如果一个发生故障)(因此vcl_recv和{{1之间的时间在vcl_fetch_response中确定它是浪费资源。

但是在Varnish 5.0+中,您可以使用vcl_recv中提供的beresp.backend(或beresp.backend.name,因为您需要将其记录为字符串),其定义为:

  

这是我们从中获取的后端。如果bereq.backend设置为导演,则这将是导演选择的后端。

请参阅:https://varnish-cache.org/docs/5.0/reference/vcl.html#beresp