Назад | Перейти на главную страницу

Идеальная настройка Varnish и nginx для обеспечения согласованности кеша в нескольких экземплярах

Ищем идеальную настройку, включающую nginx в качестве балансировщика нагрузки верхнего уровня, который распределяет нагрузку между несколькими экземплярами Varnish.

Как лучше всего распределить эту нагрузку? Один из способов - просто равномерно распределить его по экземплярам, ​​а другой - распределить нагрузку на основе шаблона URL-адреса запроса. Есть ли лучший способ для этого?

Также - у нас есть ситуация, когда нам нужно вручную (из бэкэнда) очистить определенные элементы из наших кешей. Самый эффективный способ сделать это - просто послать небольшой HTTP-запрос «PURGE» каждому из наших экземпляров Varnish?

Как лучше всего распределить эту нагрузку? Один из способов - просто равномерно распределить его по экземплярам, ​​а другой - распределить нагрузку на основе шаблона URL-адреса запроса. Есть ли лучший способ для этого?

Это зависит. Две причины, по которым вы захотите основывать распространение на чем-то вроде хэша URL:

  1. Размер кэша. Если вы кэшируете в целом достаточно данных, чтобы заполнить кеш заданного бэкэнда, было бы полезно, чтобы определенный URL-адрес всегда обращался к одному и тому же бэкэнду, чтобы распределять хранилище данных кеша между бэкэндами вместо хранения дубликатов.
  2. Скорость пропущенного запроса / время жизни кеша. Если клиент запрашивает отсутствие кеша, это проблема, и ваш кеш длится недолго, вы, вероятно, получите меньше пропусков, если данный фрагмент контента всегда будет попадать на данный сервер Varnish.

Также - у нас есть ситуация, когда нам нужно вручную (из бэкэнда) очистить определенные элементы из наших кешей. Самый эффективный способ сделать это - просто послать небольшой 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").