Я настроил Nginx для кеширования всех ответов вышестоящего сервера, который всегда возвращает Cache-Control: public, max-age=1
но кажется, что nginx кеширует ответ в течение 2 секунд. Как придешь?
В частности, мой вышестоящий сервер - это простое приложение Express.js (node), которое возвращает текущее время:
app.get('/', function (req, res) {
res.setHeader('Cache-Control', 'public, max-age=1');
res.send((new Date()).toISOString());
});
А это соответствующий конфиг nginx:
http {
proxy_cache_path /data levels=1:2 keys_zone=zuul:10m max_size=10g;
...
server {
location / {
proxy_cache zuul;
proxy_pass http://zuul;
proxy_cache_use_stale updating;
proxy_cache_background_update on;
}
listen 0.0.0.0:80 default_server;
}
}
Затем я завиваюсь http://localhost
в цикле и ожидайте, что ответ (содержащий метку времени, которую видит node.js) будет меняться каждую секунду. Вместо этого он меняется каждые две секунды. Это как если бы Nginx не желал кэшировать ответы менее двух секунд, не соблюдая max-age
возвращено восходящим потоком.
Как убедить Nginx кэшировать ответы
Отказ от ответственности
Это не может быть решением проблемы OP. Я нашел эту тему, когда искал ответ на точный вопрос, который указан в заголовке (он занимает высокое место в результатах поиска Google). Я отправляю этот ответ, потому что кто-то может найти его полезным, найдя эту тему, как я.
Ответ
В моем случае я обнаружил, что директивы установлены на
proxy_cache_valid 200 302 30m;
proxy_ignore_headers Set-Cookie X-Accel-Expires Expires Cache-Control;
и nginx не уважал max-age
в Cache-Control
заголовок и все кешировалось полчаса. Эти директивы были «спрятаны» в nginx.conf
файл вместо конфигурации vhost, поэтому обязательно проверьте это место. Я удалил Cache-Control
из второй директивы, и теперь все кэшируется правильно.
Это, вероятно proxy_cache_use_stale обновление, в сочетании с proxy_cache_background_update. В документации говорится
proxy_cache_use_stale
Определяет, в каких случаях устаревший кэшированный ответ может использоваться во время связи с прокси-сервером.
Параметр обновления позволяет использовать устаревший кэшированный ответ, если он в настоящее время обновляется. Это позволяет минимизировать количество обращений к прокси-серверам при обновлении кэшированных данных.
proxy_cache_background_update
Позволяет запустить фоновый подзапрос для обновления просроченного элемента кэша, в то время как устаревший кешированный ответ возвращается клиенту. Обратите внимание, что необходимо разрешить использование устаревшего кешированного ответа при его обновлении.
Мне кажется, он делает именно то, что вы ему сказали.
Возможное решение
Я подозреваю, что ты хочешь
proxy_cache_use_stale off;
proxy_cache_background_update off;