Я хочу использовать хэш-директор в 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(...);
}
Что я должен поместить туда в хэш на host + path, без строки запроса?
Не похоже, что 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);
}
И еще один приятный 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, "\?.*$", ""));
}
}
Надеюсь это поможет!