Сборка фронта кладёт хэш содержимого в имя каждого бандла: 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'
Пустой вывод — всё в порядке. Любая строка — закэшированная страница ссылается на файл, которого больше нет.
После выката перестали работать формы?
Пришлите адрес — проверю, на что ссылаются закэшированные страницы.
// загружаю комментарии…