Сборка фронта кладёт хэш содержимого в имя каждого бандла: form.3f9a1c.js. Это отлично для кэша браузера — изменился файл, изменилось имя. Но у этого есть обратная сторона, которая проявляется только вместе с кэшем страниц.

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

Что случилось

Выкат копировал файлы с удалением лишних: старые бандлы, которых нет в новой сборке, удалялись. А страница в кэше nginx была собрана до выката и ссылалась на старые имена. Из 10 бандлов, на которые ссылалась закэшированная страница, 4 отдавали 404.

Скрипты форм не загружались. Внешне страница выглядела нормально — а заявки не отправлялись.

Почему сброс при выкате не всегда спасает

Сброс кэша при выкате (двадцатая часть) срабатывает на первом запросе к PHP после выката. Между удалением старых файлов и сбросом есть окно — от секунд до минуты, — когда HIT-страница отдаётся без участия PHP и ссылается на уже удалённые бандлы. А если сброс сорвался (двадцать вторая и двадцать пятая части), окно длится до следующего сброса.

Как защититься

  • не удалять старые бандлы сразу — оставлять файлы предыдущей сборки хотя бы до следующего выката; места они занимают мало;
  • сброс кэша должен быть надёжным — см. предыдущие части про выкат.

Проверка после выката

# все скрипты и стили, на которые ссылается закэшированная страница, должны отвечать 200
curl -s https://сайт/ | grep -oE '(src|href)="[^"]+\.(js|css)[^"]*"' | cut -d'"' -f2 |
while read u; do
  case "$u" in http*) ;; *) u="https://сайт$u";; esac
  printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$u"
done | grep -v '^200'

Пустой вывод — всё в порядке. Любая строка — закэшированная страница ссылается на файл, которого больше нет.

После выката перестали работать формы?

Пришлите адрес — проверю, на что ссылаются закэшированные страницы.

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

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

Комментарии

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

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