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

Понимание директивы nginx proxy_cache_path

Предположим, у меня есть этот файл конфигурации nginx

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;

Кроме того, все активные ключи и информация о данных хранятся в общей зоне памяти, имя и размер которой настраиваются параметром keys_zone.

Спасибо!

Что означает keys_zone = myCache: 8m?

Так как в документации сказано, nginx сохранит все активные ключи и информация о данных сохраняются в зоне общей памяти, чья name и size настраиваются параметром keys_zone. Для полноты картины давайте разберемся по частям

  • /var/cache/nginx это место, где хранится фактический кеш. Внутри папки файл кеша был двоичным файлом, но внутри него можно легко найти тег html.
  • levels=1:2 Параметр level устанавливает количество уровней подкаталогов в кеше.
  • keys_zone=myCache:8m определяла зону разделяемой памяти myCache с максимальным размером 8 МБ. Он содержит все активные ключи и метаданные кеша. Таким образом, всякий раз, когда nginx проверяет, была ли страница кэширована, он сначала обращается к зоне общей памяти, а затем ищет местоположение фактического кеша в /var/cache/nginx если кеш существует.
  • max_size был максимальный размер кеша, например размер файлов на /var/cache/nginx.
  • inactive=1h указать максимальное время, в течение которого может храниться кеш-память. Кэшированные данные, к которым нет доступа в течение времени, указанного в inactive удаляются из кеша независимо от их свежести.

Как работает проверка и удаление кеша

Взято из списки рассылки nginx

  • Директива proxy_cache_valid указывает, как долго ответ будет считаться действительным (и будет возвращен без каких-либо запросов к бэкэнду). По истечении этого времени ответ будет считаться «устаревшим» и либо не будет возвращен, либо будет зависеть от proxy_cache_use_stale настройка.

  • Аргумент неактивный из proxy_cache_path указывает, как долго ответ будет храниться в кеше после последнего использования. Обратите внимание, что даже устаревшие ответы будут считаться использованными недавно, если к ним поступят запросы.

Как я понял, вот псевдокод, как работает nginx

При поступлении запроса

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

В другом процессе диспетчер кеша выполняет эту логику

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

Что, если proxy_cache_valid (12h) выше, чем указанное неактивное значение (1h) в proxy_cache_path?

Пока запрос и доступ к конкретному кешу, этот объект кеша будет действителен до 12 часов после помещения объекта в кеш. После этого кеш считался недействительным, поэтому nginx будет извлекать данные из серверной части и сбрасывать действующий таймер. Но если объект был неактивен (недоступен) более одного часа - даже в течение 12 часов valid-cache-period -, nginx будет удали это из-за inactive параметр.