我有以下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
如何正确检查以查看选择了哪个后端?
由于
答案 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