LINUX.ORG.RU
ФорумAdmin

Nginx: отправка If-Modified-Since бекэнду

 


0

2

Я хочу заставить nginx кешировать любые ответы бекэнда вне зависимости от желания браузера (cache-control: no-cache должен игнорироваться). Таким образом, чтоб если у nginx есть что-то в кеше (даже если оно протухло несколько лет назад), он обязательно отправил бекэнду заголовок If-Modified-Since и дал шанс ответить 304 Not Modified.

В настоящий момент я написал такой конфиг:

proxy_cache_path cache/ keys_zone=my_cache:10m max_size=10g use_temp_path=off;
...
location / {
    proxy_cache my_cache;
    proxy_cache_revalidate on;
    proxy_cache_use_stale updating;
    proxy_cache_background_update on;
    proxy_cache_lock on;
    proxy_pass http://localhost:8080/;
    proxy_ignore_headers Cache-Control;
}

Бекэнд добавляет к своим ответом заголовок (пробовал разные комбинации, результат не меняется):

Cache-Control: max-age=60, must-revalidate, public

При первом обращении nginx кеширует ответ на диск, при последующих запросах вообще не обращается к бекэнду, но стоит кешу протухнуть он обращается к бекэнду без if-modified-since, соответственно бекэнд не может знать, что у него есть шанс ответить 304 вместо полноценной обработки запроса.

Я хочу заставить nginx обращаться к бекэнду всегда (этого легко добиться, например, max-age=1), но при этом всегда же он проверял изменённость ответа (if-modified-since) и бекэнд уже решал напрягаться ему полной обработкой или отдать 304 с пустым телом.

Что я делаю не так?

★★★★★

Есть такое ощущение, что ты сейчас описываешь свои фантазии на тему решения некой задачи, не описывая самой задачи?

zolden ★★★★★ ()
Ответ на: комментарий от zolden

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

Я не хочу самостоятельно организовывать логику построения кешей (тем более, что страниц несколько десятков) и их обновления в фоне, а свалить всё на nginx.

KivApple ★★★★★ ()
Последнее исправление: KivApple (всего исправлений: 3)
Ответ на: комментарий от zolden

Прочитал про заголовок Last-Modified. Начал его отдавать с бекэнда. Теперь nginx иногда присылает If-Modified-Since. Но не всегда. Например, если в браузере дважды нажать F5, то второй раз придёт без If-Modified-Since. Хочется, чтобы nginx абсолютно всегда слал этот заголовок, если его кеш не пуст.

KivApple ★★★★★ ()

ну так добавить заголовок, вам это надо?
proxy_set_header If-Modified-Since «Wed, 20 Oct 2020 00:28:00 GMT»;
а уж какую именно дату вам надо решайте.

st4l1k ★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей