Назад | Перейти на главную страницу

nginx кэширует ответы дольше, чем max-age

Я настроил 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;