Кэш страниц в nginx настраивается несколькими строками. Три из них определяют почти всё — и именно их путают чаще всего. «Сделать кэш на неделю», «почему утром всё холодное», «почему кэш не растёт» — ответы на эти вопросы в трёх разных параметрах.

Это вторая часть цикла «Кэш страниц без MISS».

ПараметрЧто делаетГде задаётся
fastcgi_cache_validсрок свежести: после него копия считается устаревшей и при следующем обращении обновляетсяв блоке location сайта
inactiveудаляет файл, к которому не обращались столько времени, — независимо от свежестив fastcgi_cache_path
max_sizeпотолок объёма; при переполнении удаляются давно не запрошенные копиитам же

«Кэш на неделю» — это про valid. А редкие страницы, к которым заходят раз в несколько дней, держит в кэше не valid, а inactive.

Как inactive опустошал кэш за ночь

На одном сайте стояло inactive=2h. Днём всё было хорошо: страницы посещались, файлы жили. Ночью трафика нет — и через два часа простоя nginx удалял почти все копии. Утром первые посетители получали MISS: 79 страниц из 89 были холодными, хотя кэш блоков на тех же страницах был тёплым на 100 %.

На крупном сайте с той же настройкой этого не видели: 116 тысяч запросов в сутки сами держали файлы живыми. Настройку спасал трафик — до первой тихой ночи.

Удалённый файл нельзя отдать даже как устаревший. Механизм «отдай старое, пока обновляется» работает, только пока копия есть на диске. inactive её удаляет — и дальше только MISS.

max_size и холодный хвост

При переполнении nginx чистит копии, к которым дольше всего не обращались. Это ровно те редкие страницы — глубокие товары, старые статьи, — ради которых мы держим прогрев. Если потолок мал, прогрев греет, а nginx тут же выкидывает.

Конфигурация, к которой мы пришли

# в http-блоке
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2
    keys_zone=WORDPRESS:50m inactive=7d max_size=1g;

# в location ~ \.php$
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 7d;
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_cache_background_update on;
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;
  • use_stale … updating + background_update on — устаревшая копия отдаётся мгновенно, обновление идёт фоном;
  • cache_lock — если копии нет, рендерит один запрос, остальные ждут его, а не запускают десять одинаковых сборок;
  • inactive=7d — страница живёт неделю даже без посещений;
  • valid 7d — почему неделя, а не полчаса, разберём в четвёртой части.

valid и max_size лежат в разных файлах (сайт и общий блок http), но править их нужно за один заход: удлинили valid — кэш вырастет, и маленький потолок начнёт выкидывать хвост (пятая часть).

Утром сайт «просыпается» медленно?

Пришлите адрес — проверю настройки кэша и что на самом деле лежит на диске.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.