Кэш страниц в 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 — кэш вырастет, и маленький потолок начнёт выкидывать хвост (пятая часть).
Утром сайт «просыпается» медленно?
Пришлите адрес — проверю настройки кэша и что на самом деле лежит на диске.
// загружаю комментарии…