Nginx: использование X-Accel-Expires с Cache-Control
Я использую Nginx в качестве кеширующего прокси-сервера. У меня проблемы с кэшированием ответов с использованием заголовков X-Accel-Expires и Cache-Control.
Мой апстрим возвращает некоторое тело запроса с заголовками в nginx:
[...]
X-Accel-Expires: 60
Cache-Control: no-cache
[...]
Я хочу, чтобы nginx кэшировал ответ в течение 60 секунд, но клиенты получат только заголовок Cache-Control: no-cache (поэтому они не будут кэшировать ответ в браузере).
Но nginx не кеширует этот ответ. Nginx соблюдает заголовок Cache-Control и игнорирует заголовок X-Accel-Expires. Я думал, что X-Accel-Expires "сильнее", чем Cache-Control, но это не так.
Есть ли способ изменить это?
Я знаю, что я могу использовать:
proxy_ignore_headers Cache-Control;
Но я не могу этого сделать, потому что у меня нет заголовков X-Accel-Expires в каждом ответе от вышестоящего сервера.
Подводя итог, когда я возвращаю заголовки thoose из верхнего потока:
X-Accel-Expires: 60
Cache-Control: no-cache
Я хочу кэшировать ответ в nginx кеш на 60 с, но возвращаюсь к клиентам Cache-Control: no-cache.
Но когда я вернусь это:
Cache-Control: max-age=90
(без заголовка X-Accel-Expires) Я хочу кэшировать ответ в кеше nginx в течение 60 с и вернуть клиентам Cache-Control: заголовок max-age=90.
Это возможно?
1 ответ
Затем,
- Изменить вышестоящий поток для отправки
X-Accel-Expires
заголовок каждый раз или добавьте егоadd_header
директива (используя, например,$http_cache_control
в операторе if). - игнорировать
Cache-Control
заголовок для кэширования каждый раз. - Используйте вышестоящий блок.
map $upstream_http_cache_control $cache_control_value { "~^max-age=(?<duration>\d+)$" "$duration"; }
сервер {
listen 127.0.0.1:80; upstream nodes { server foo; } location / { if ($upstream_http_x_accel_expires = '') { add_header "X-Accel-Expires" $cache_control_value; } proxy_set_header "Host" $host; proxy_pass http://nodes; }
}
сервер {
server_name mydomain.com; listen X.X.X.X:80; upstream intermediate { server 127.0.0.1; } location / { proxy_set_header "Host" $host; proxy_pass http://intermediate; proxy_ignore_headers 'Cache-Control'; proxy_cache mycache; }
}
В последнем случае обратитесь к первому пункту или используйте proxy_cache_valid
, но с помощью этого последнего параметра вы не можете сделать время ожидания динамическим. Вам нужен какой-то согласованный рабочий процесс в одной точке.