Почему Varnish кэширует фрагменты ESI (когда я говорю этого не делать)?

Я столкнулся со специфической проблемой с Varnish ESI.

На каждой странице моего сайта есть фрагмент ESI, который выводит информацию об учетной записи (вошедшего в систему) пользователя.

Похоже, что Varnish возвращает кэшированный результат фрагмента ESI пользовательского сеанса, если браузер не отправляет Cache-Control: no-cache / Pragma: no-cache (принудительное обновление), когда он запрашивает содержимое ESI с сервера.

мой vcl_recv содержит правила для обхода этого:

if(req.url ~ "^/session-header") {
    return(pass);
}

vcl_fetch также имеет правило:

if(req.url ~ "^/session-header") {
    return(hit_for_pass);
} else {
  set beresp.ttl = 1h;
}

По сути, это поведение со стороны браузера:

Cache-Control: max-age = 0 => Varnish возвращает кешированный фрагмент ESI

Cache-Control: no-cache / Pragma: no-cache => Varnish получает фрагмент ESI с сервера

Кажется, я не могу понять этого, и у меня такое чувство, что я пропустил довольно очевидную конфигурацию.


person user1497331    schedule 23.03.2014    source источник
comment
В случае, если кто-то это увидит, разобрался в проблеме. Оказывается, мой бэкэнд устанавливал Etag, который Varnish использовал, чтобы решать, обслуживать ли свежие фрагменты ESI. Я просто добавил эту строчку в vcl_deliver, и теперь она работает как шарм! sub vcl_deliver {... не задано соответственно http.Etag; ...}   -  person user1497331    schedule 24.03.2014


Ответы (2)


В случае, если кто-то это видит, разобрался в проблеме.

Оказывается, бэкэнд устанавливал Etag, который Varnish использовал, чтобы решить, следует ли обслуживать свежие фрагменты ESI с сервера (браузер будет отправлять этот Etag в заголовке запроса If-None-Match, если только это не было принудительное обновление).

Я просто добавил эту строчку в vcl_deliver, и теперь она работает как шарм!

subl vcl_deliver {
  ...
  unset resp.http.Etag;
  ...
}
person user1497331    schedule 24.03.2014
comment
Спасибо. Это решило очень раздражающую и, по-видимому, недостаточно хорошо задокументированную настройку, требуемую в Varnish для esi. - person Forer; 19.05.2017

Мне пришлось перебить заголовки запросов If-Modified-Since и If-None-Since для шаблона esi, чтобы предотвратить обслуживание выходных данных, собранных с помощью esi.

sub vcl_recv {
...
      unset req.http.If-Modified-Since;
      unset req.http.If-None-Match;
...
}
person Randy Kang    schedule 10.02.2015