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

30

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

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • Что keys_zone=myCache:8mзначит? Там не так много сказано в документах:

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

  • Что если proxy_cache_valid( 12h) выше указанного inactiveзначения ( 1h) в proxy_cache_path? Какому правилу оно будет следовать? например

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

Благодарность!

Юрген Пауль
источник

Ответы:

39

Что значит 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-часового периода действительного кэша - nginx удалит его из-за inactiveпараметра.

masegaloeh
источник
«После этого кеш считался недействительным, поэтому nginx будет извлекать данные из бэкэнда и сбрасывать действующий таймер». - Это интересно. Таким образом, nginx получает запрос, даже если ни один пользователь не получает его? Так, например, если inactive is 365dи valid is 1dnot, то nginx будет получать запросы в кэш каждый день в течение года, даже если никто не делает этот запрос?
Мартин Тома
1
Хороший ответ, но я не могу найти какую-либо документацию по единицам измерения, которые мы используем с некоторыми из этих параметров. Например, inactiveпараметры принимают значения времени, но я не вижу, какие значения я могу использовать, кроме h(как около 1 месяца? Или 1 день? И т. Д.). И что мы должны указывать max_size? Б? Могу ли я использовать 1M на 1 мегабайт?
Сунил Д.
4
@SunilD. - вот и вы: nginx.org/en/docs/syntax.html
adamczi