Я использую Nginx в качестве кеширующего прокси-сервера. У меня проблемы с кешированием ответов при использовании обоих X-Accel-истекает и Кэш-контроль заголовки.
Мой апстрим возвращает тело запроса с заголовками в nginx:
[...]
X-Accel-Expires: 60
Cache-Control: no-cache
[...]
Я хочу, чтобы nginx кэшировал ответ на 60 секунд, но клиенты получат только Cache-Control: без кеша заголовок (чтобы они не кешировали ответ в браузере).
Но nginx не кэширует этот ответ. Nginx честь Кэш-контроль заголовок и игнорирование X-Accel-истекает заголовок. я думал что X-Accel-истекает "сильнее", чем Кэш-контроль но это не так.
Есть ли способ это изменить?
Я знаю, что могу использовать:
proxy_ignore_headers Cache-Control;
Но я не могу этого сделать, потому что у меня нет X-Accel-истекает заголовки в каждом ответе вышестоящего сервера.
Подводя итог, когда я возвращаю эти заголовки из восходящего потока:
X-Accel-Expires: 60
Cache-Control: no-cache
Я хочу кешировать ответ в кеше nginx на 60 секунд, но возвращаюсь клиентам Cache-Control: без кеша.
Но когда я верну это:
Cache-Control: max-age=90
(без X-Accel-истекает заголовок) Я хочу кэшировать ответ в кеше nginx на 60 секунд и вернуть клиентам Cache-Control: max-age = 90 заголовок.
Это возможно?
Затем,
X-Accel-Expires
заголовок каждый раз или добавьте его с помощью add_header
директива (используя, например, $http_cache_control
в операторе if).Cache-Control
заголовок для кеширования каждый раз.map $upstream_http_cache_control $cache_control_value { "~^max-age=(?<duration>\d+)$" "$duration"; }
server {
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 {
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
, но с этим последним параметром вы не можете сделать тайм-аут динамическим. В какой-то момент вам нужен согласованный рабочий процесс.