Хэширование
Внутренне, когда Varnish хранит контент в кэше, индексируя его по ключу хэша, используемому для поиска объекта. В стандартной настройке этот ключ рассчитывается на основе URL, Host: заголовка или, если его нет, IP-адреса сервера:
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
Как вы можете видеть, сначала хэшируется req.url, а затем req.http.host (если он существует). Стоит отметить, что Varnish не приводит имя хоста или URL к нижнему регистру перед хэшированием, поэтому теоретически «Varnish.org/» и «varnish.org/» приведут к разным записям в кэше. Однако браузеры, как правило, приводят имена хостов к нижнему регистру.
Вы можете изменить то, что входит в хэш. Таким образом, вы можете сделать так, чтобы Varnish предоставлял различный контент разным клиентам на основе произвольных критериев.
Предположим, вы хотите предоставлять страницы на разных языках своим пользователям, основываясь на местоположении их IP-адреса. Вам потребуется некоторый Vmod для получения кода страны, а затем включить его в хэш. Это может выглядеть так.
В vcl_recv:
set req.http.X-Country-Code = geoip.lookup(client.ip);
А затем добавьте vcl_hash:
sub vcl_hash {
hash_data(req.http.X-Country-Code);
}
Поскольку return(lookup) отсутствует, встроенный VCL позаботится о добавлении URL, Host: или IP-адреса сервера в хэш, как обычно.
Если vcl_hash возвратит значение, то есть:
sub vcl_hash {
hash_data(req.http.X-Country-Code);
return(lookup);
}
то только код страны будет иметь значение, и Varnish вернёт, по-видимому, случайные объекты, игнорируя URL (но они всегда будут содержать правильный X-Country-Code).
Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/users-guide/vcl-hashing.html