如何基于主机+path在光油散列?

我想在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, "?.*$", "")); } } 

希望这可以帮助!