如何基于Varnish中的主机+路径进行散列?

Ben*_*rel 5 varnish

我想使用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)

在没有查询字符串的情况下,我应该在主机 + 路径上放什么来散列?

Cas*_*lia 3

看起来VCL提供的默认对象并没有提供获取请求路径的req方法,没有查询参数,只有完整的URL。因此,使用一些 VMOD 可能会有所帮助。

您可以尝试使用QueryStringVMOD,例如(来自他们的文档):

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)

希望这可以帮助!