我想使用Varnish 中的hash Director将没有查询参数的同一 URL 的所有请求重定向到同一服务器:
例如,
http://example.com/foo/bar?a=1
http://example.com/foo/bar?a=2&b=3
Run Code Online (Sandbox Code Playgroud)
应该散列到同一台服务器。我只想在主机和路径上散列。
这是我的配置:
sub vcl_init {
new workers = directors.hash();
workers.add_backend(worker_1, 1);
workers.add_backend(worker_2, 1);
workers.add_backend(worker_3, 1);
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要在这里设置哈希函数:
sub vcl_recv {
set req.backend_hint = workers.backend(...);
}
Run Code Online (Sandbox Code Playgroud)
在没有查询字符串的情况下,我应该在主机 + 路径上放什么来散列?
看起来VCL提供的默认对象并没有提供获取请求路径的req
方法,没有查询参数,只有完整的URL。因此,使用一些 VMOD 可能会有所帮助。
您可以尝试使用QueryString
VMOD,例如(来自他们的文档):
import querystring;
sub vcl_hash {
if (req.method == "GET" || req.method == "HEAD") {
hash_data(querystring.remove(req.url));
}
else {
hash_data(req.url);
}
hash_data(req.http.host);
return (lookup);
}
Run Code Online (Sandbox Code Playgroud)
另一个不错的 VMODVSLP
可能也会引起人们的兴趣,因为它提供了对后端选择的更多控制。
使用 Varnish 4.1,您也许可以使用:
sub vcl_recv {
if (req.http.host) {
set req.backend_hint = workers.backend(req.http.host + regsub(req.url, "\?.*$", ""));
}
else {
set req.backend_hint = workers.backend(server.ip + regsub(req.url, "\?.*$", ""));
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
归档时间: |
|
查看次数: |
1969 次 |
最近记录: |