Кэш страниц хранит не «страницу», а ячейку под ключом. Всё, что входит в ключ, дробит страницу на варианты. Всё, что влияет на разметку, но в ключ не входит, — это боевой баг: первый посетитель запечёт свой вариант для всех.
Это шестая часть цикла «Кэш страниц без MISS».
Из чего состоит ключ
fastcgi_cache_key "$scheme$request_method$host$request_uri:m$is_mobile:l$cookie_lang";
- схема и хост — у каждого поддомена и у http/https свои ячейки;
- метод — GET и HEAD хранятся отдельно;
- адрес с параметрами —
/catalog/и/catalog/?utm_source=xразные ячейки; - мобильность — если вёрстка разная для телефона и компьютера;
- язык — если язык берётся из куки.
HEAD — это другая ячейка
Удобно проверять кэш командой curl -I: она показывает заголовки, в том числе статус кэша. Но -I шлёт запрос HEAD, а метод входит в ключ. Проверка 250 страниц так создала 250 мусорных ячеек — и показывала статус не той ячейки, которую получает посетитель.
Проверяйте запросом GET с выбросом тела: curl -s -o /dev/null -D - https://сайт/путь/.
У меня MISS, а у всех HIT
На одном каталоге кука сортировки ставилась при каждом клике по пагинации — даже со значением default. Кука входила в ключ, и у посетителя, полиставшего каталог, был свой набор ячеек, который никто не грел. Половину страниц он открывал с MISS.
Лечение — склеить значение по умолчанию с отсутствием куки картой:
map $cookie_order $cache_order {
default $cookie_order;
~^default$ "";
}
Квирк nginx: строку default в левой части карты можно поймать только регулярным выражением. Если написать "default" "";, nginx откажется стартовать с ошибкой duplicate default map parameter — слово занято под значение по умолчанию.
Как найти то, что забыли положить в ключ
# всё, что читает куки при рендере
grep -rn '\$_COOKIE' wp-content/themes/ wp-content/plugins/ --include=*.php
# и сверить с тем, что реально в ключе
grep -rn 'fastcgi_cache_key' /etc/nginx/
Каждая находка из первого списка должна быть либо в ключе, либо перенесена на клиент (об этом — восьмая и девятая части), либо не влиять на разметку.
Подозреваете, что кэш у разных посетителей разный?
Пришлите адрес — сверю ключ кэша с тем, что реально меняет разметку.
// загружаю комментарии…