如何在 Varnish 中根据主机 + 路径进行哈希处理?

如何在 Varnish 中根据主机 + 路径进行哈希处理?

我想使用哈希导演在 Varnish 中重定向对同一 URL 的所有请求没有查询参数到同一服务器:

例如,

http://example.com/foo/bar?a=1
http://example.com/foo/bar?a=2&b=3

应该散列到同一台服务器。我想散列主持人小路仅有的。

这是我的配置:

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(...);
}

在没有查询字符串的情况下,我应该在主机+路径上输入什么来进行哈希处理?

答案1

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

您可以尝试使用QueryString虚拟模式,例如(摘自他们的文档):

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也可能引起人们的兴趣,因为它提供了对后端选择的更强的控制。

使用 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, "\?.*$", ""));
    }
}

希望这可以帮助!

相关内容