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

Это шестая часть цикла «Кэш страниц без 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/

Каждая находка из первого списка должна быть либо в ключе, либо перенесена на клиент (об этом — восьмая и девятая части), либо не влиять на разметку.

Подозреваете, что кэш у разных посетителей разный?

Пришлите адрес — сверю ключ кэша с тем, что реально меняет разметку.

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

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

Комментарии

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

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