Я хочу настроить лак (еще на версии 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