2

我有以下 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

如何正确检查已选择哪个后端?

谢谢

4

2 回答 2

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");
    }
}
于 2017-04-21T04:31:46.080 回答
0

更新:在请求后端调用之前不可能知道选择的后端,所以你永远不会在vcl_recv. 由于您可能不需要后端选择(如果对象已经在缓存中),或者因为后端可能会在选择运行之前发生变化(如果出现故障)(因此vcl_recvand之间的时间vcl_fetch_response),这将浪费资源来确定它vcl_recv

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

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

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

于 2018-04-10T04:13:59.130 回答