我想在Varnish中使用哈希指示器来redirect所有请求的同一个URL 没有查询参数到同一台服务器:
例如,
http://example.com/foo/bar?a=1 http://example.com/foo/bar?a=2&b=3
应该哈希到相同的服务器。 我只想散列主机和path 。
这是我的configuration:
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); }
我知道我需要在这里设置哈希函数:
sub vcl_recv { set req.backend_hint = workers.backend(...); }
我应该把什么东西放在主机+path散列,没有查询string?
它看起来不像默认的VCL提供的req对象提供了一种获取请求path的方法 ,没有查询参数,只是完整的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); }
而另外一个不错的VMOD, VSLP也许会引起人们的兴趣,因为它提供的后台select控制能力更强。
使用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, "?.*$", "")); } }
希望这可以帮助!