Кеширование и сжатие: бесплатная скорость, которую никто не забирает
Cache-Control, который действительно кеширует, почему хеш в имени файла меняет всё, и настройка сжатия, которой до сих пор нет на половине сайтов.
Инфраструктура · Опубликовано: 30 августа 2026 г. · 3 мин чтения · Анна Ковалёва
Большая часть работы над скоростью дорогая: переписать компоненты, отложить скрипты, поспорить о фреймворке. Две настройки — нет. Они лежат в конфиге, занимают полдня и до сих пор выставлены неверно на изрядной доле продакшен-сайтов.
Сначала сжатие
Текст сжимается на семьдесят-восемьдесят процентов. HTML, CSS, JavaScript, JSON, SVG — всё это текст. Если в ответе нет Content-Encoding, вы отдаёте вчетверо больше байт просто так.
Brotli выигрывает у gzip примерно пятнадцать процентов на том же контенте и поддерживается везде, где это важно; gzip оставьте запасным вариантом. Две частые ошибки: сжимать изображения (JPEG и PNG уже сжаты — тратите процессор ни за что) и забывать, что настройка действует по MIME-типу, так что поддомен, отдающий JSON из другого конфига, тихо шлёт его сырым.
Cache-Control по-честному
Заголовок отвечает на два вопроса: можно ли это хранить и как долго. Полезных схем немного.
Ассеты с хешем — /app.4f2a91.js:
Cache-Control: public, max-age=31536000, immutable
Год и без перепроверок. Безопасно именно потому, что имя файла меняется вместе с содержимым. Это самый крупный доступный выигрыш, и работает он, только если сборка действительно хеширует имена.
HTML:
Cache-Control: no-cache
Вопреки названию это не «не кешировать». Это «сохрани, но перед использованием переспроси». Браузер отправляет If-None-Match и обычно получает 304 без тела — быстро и никогда не протухает.
Персональные ответы:
Cache-Control: private, no-store
Для всего, что общий кеш хранить не должен: личный кабинет, корзина, всё за логином.
Ошибки, которые дороже всего
Короткий max-age на файлах с хешем. max-age=600 на имени с хешем содержимого перечёркивает всю выгоду.
Длинный max-age на файлах без хеша. /logo.png, закешированный на год, означает, что редизайн не доедет ни до кого, кто заходил раньше.
Нет ETag или Last-Modified на HTML. Без валидатора браузер не может спросить «изменилось ли»; он скачивает документ целиком.
Неверный Vary. Vary: User-Agent дробит кеш CDN на тысячи почти одинаковых записей и почти никогда не является тем, что вы имели в виду.
Проверяйте, а не предполагайте
Конфигурация — одно, а то, что реально долетает до браузера, — другое: CDN, прокси или панель хостинга могут переписать заголовки по дороге. Проверка идёт по каждому ответу и по всему сайту:
для каждого ответа:
есть content-encoding на text/*?
cache-control соответствует классу ресурса?
есть etag или last-modified на документах?
Запускайте после каждого деплоя. Этот класс регрессий беззвучный — ничего не ломается, сайт просто становится медленнее, а счёт за трафик растёт, — потому он и живёт годами, пока никто не смотрит.
Читайте также
Проверьте, что из этого есть на вашем сайте
Бесплатное сканирование покажет битые ссылки, ошибки JS и проблемы производительности за минуту.