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

Varnish: Как кешировать на случай сбоя, всегда спрашивать бэкэнд здоров ли?

Я хочу настроить лак (еще на версии 3) следующим образом:

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

Я попробовал следующую конфигурацию с использованием механизма отсрочки, но это не сработало: хотя все запросы отправляются на бэкэнд (поэтому нет кешированных ответов, если бэкэнд доступен), в случае сбоя я сразу получаю ошибку Varnish (Недоступно) вместо Varnish с использованием кэшированных данных. Что я делаю не так?

sub vcl_recv {
  if (req.backend.healthy) {
    # No caching if backend is healthy
    set req.grace = 1s;
  } else {
    # Otherwise accept requests up to 1 day old
    set req.grace = 1d;
  }
}

sub vcl_fetch {
  # Cached requests are not valid at all
  set beresp.ttl = 1s;

  # Keep requests for ttl + 1 d
  set beresp.grace = 1d;
}

Насколько мне известно, это невозможно. Только кэшированные элементы могут быть обслужены без промедления Возможно, вам удастся сделать это путем модификации Varnish, написав код C в файл vcl.

Документация по лаку очень исчерпывающая, подробное описание также может помочь: https://www.varnish-cache.org/docs