Ищем идеальную настройку, включающую nginx в качестве балансировщика нагрузки верхнего уровня, который распределяет нагрузку между несколькими экземплярами Varnish.
Как лучше всего распределить эту нагрузку? Один из способов - просто равномерно распределить его по экземплярам, а другой - распределить нагрузку на основе шаблона URL-адреса запроса. Есть ли лучший способ для этого?
Также - у нас есть ситуация, когда нам нужно вручную (из бэкэнда) очистить определенные элементы из наших кешей. Самый эффективный способ сделать это - просто послать небольшой HTTP-запрос «PURGE» каждому из наших экземпляров Varnish?
Как лучше всего распределить эту нагрузку? Один из способов - просто равномерно распределить его по экземплярам, а другой - распределить нагрузку на основе шаблона URL-адреса запроса. Есть ли лучший способ для этого?
Это зависит. Две причины, по которым вы захотите основывать распространение на чем-то вроде хэша URL:
Также - у нас есть ситуация, когда нам нужно вручную (из бэкэнда) очистить определенные элементы из наших кешей. Самый эффективный способ сделать это - просто послать небольшой HTTP-запрос «PURGE» каждому из наших экземпляров Varnish?
Это работает, но оставляет следующего запрашивающего контента потенциально медленную ошибку в кэше. Альтернативой является использование Varnish's req.hash_always_miss
чтобы принудительно обновить ресурс в кеше, а не просто сделать его недействительным, чтобы запрос извне не был вынужден пропустить.
В вашем vcl что-то вроде этого:
acl purge {
"localhost";
}
sub vcl_recv {
/* add this into your existing config: */
if (req.http.X-Varnish-Nuke == "1" && client.ip ~ purge) {
set req.hash_always_miss = true;
}
}
Затем запрос с этим набором заголовков заставит серверный запрос обновить содержимое в кеше (с помощью curl или wget, --header "X-Varnish-Nuke: 1"
).