Gzip и кеширование: как сжать ответ сервера и включить кэш браузера

Скорость загрузки — один из немногих факторов ранжирования, который работает сразу для всей страницы. Если сервер отдаёт HTML, CSS и JavaScript в «распакованном» виде, страница весит в разы больше, дольше открывается и хуже попадает в топ. Gzip и кеширование решают эту проблему за пять минут настройки. Разбираю на конкретных цифрах и примерах конфигураций, как включить сжатие, не сломать кэш прокси и проверить результат без платных сервисов.

Что такое Gzip и зачем для SEO важна скорость загрузки

Представьте обычную страницу: HTML-код, стили и скрипты. В несжатом виде они занимают немало места — HTML часто весит 50–100 КБ, CSS 20–50 КБ, а JavaScript и вовсе 100–500 КБ. Сумма по одной странице легко доходит до 200–650 КБ только на базовые ресурсы, без учёта картинок и шрифтов.

Gzip — это алгоритм сжатия без потерь для текстовых файлов. Он убирает повторяющиеся фрагменты кода и сокращает размер HTML, CSS, JavaScript, JSON, XML и SVG на 60–80%. Страница, которая весила 500 КБ, после сжатия «сжимается» до 100–150 КБ. Браузер получает меньший файл, скачивает его быстрее, а сервер тратит меньше трафика и ресурсов.

Почему это важно именно для SEO:

  • Поисковые системы, в первую очередь Google, учитывают скорость страниц в ранжировании — как на десктопе, так и на мобильных устройствах.
  • Медленная страница увеличивает показатель отказов: пользователи уходят, не дождавшись загрузки.
  • Меньший объём данных снижает нагрузку на хостинг и улучшает показатели Core Web Vitals, особенно Large Contentful Paint.

Простыми словами: сжатие делает сайт быстрее, а скорость напрямую влияет на позиции и поведенческие факторы. Отдельно стоит упомянуть, что вопрос скорости обсуждался подробно в статье про скорость загрузки сайта для SEO — Gzip и кэш там выступают базовыми элементами оптимизации.

Как включить gzip в nginx

Это самый популярный вариант на современных серверах. Достаточно добавить несколько строк в конфиг nginx.conf или в блок server:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_vary on;
gzip_proxied any;
gzip_buffers 16 8k;

Разберу ключевые директивы. gzip on включает сжатие. gzip_types перечисляет MIME-типы, которые нужно сжимать — по умолчанию nginx не сжимает ничего, кроме HTML. gzip_min_length 1000 не сжимает файлы меньше 1 КБ, чтобы накладные расходы на сжатие не превысили выгоду. gzip_comp_level 6 — рекомендуемый уровень: баланс между размером и нагрузкой на процессор.

Как включить gzip в Apache через .htaccess

Если сайт работает на Apache, используйте модуль mod_deflate. Правила прописываются в файле .htaccess:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/css application/json application/javascript text/xml application/xml text/javascript
    DeflateCompressionLevel 6
    SetOutputFilter DEFLATE
</IfModule>

AddOutputFilterByType выбирает типы файлов для сжатия, DeflateCompressionLevel задаёт уровень, а SetOutputFilter DEFLATE применяет фильтр к ответу. Убедитесь, что модуль включён на сервере — проверить это можно через phpinfo() или у хостинг-провайдера.

Как проверить, что сжатие работает

Самый быстрый способ — запросить заголовки страницы через командную строку:

curl -sI 'https://example.ru/' | grep -i content-encoding

Если в ответе появляется строка Content-Encoding: gzip, сжатие активно. Если вывод пустой — сервер не сжимает файлы, и настройку нужно повторить. Для проверки через браузер откройте DevTools, вкладку Network, обновите страницу и посмотрите на колонку Content-Encoding у ресурсов.

Кеширование браузера: Cache-Control и Expires

Сжатие экономит трафик при первом посещении, но настоящую экономию даёт кэш. Когда браузер один раз скачал стили, скрипты и картинки, он должен сохранить их локально и не запрашивать заново на повторных визитах. За это отвечают заголовки кэширования.

Cache-Control — основной современный заголовок. Он задаёт стратегию в одном месте:

<IfModule mod_expires.c>
    Header set Cache-Control "public, max-age=31536000"
</IfModule>

Значение max-age=31536000 означает, что ресурс можно хранить в кэше год. Директива public разрешает сохранять ответ и у браузера, и у общих прокси. Для статических файлов с уникальными именами (с хешем в названии, как в современных сборках) это идеальный вариант.

Expires — более старый аналог, который задаёт конкретную дату окончания жизни ресурса:

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType application/javascript "access plus 1 year"
    ExpiresByType text/html "no-cache"
</IfModule>

Здесь важный нюанс: HTML стоит помечать как no-cache, чтобы пользователи всегда получали актуальную версию страницы, а не старую из кэша. Статику — изображения, стили, скрипты — наоборот, кэшируем надолго.

Хорошая практика — настраивать оба заголовка вместе: Cache-Control как основной, а Expires как запасной для старых браузеров и прокси. Об этом же рассказано в материале про HSTS и security-заголовки, где кэш рассматривается среди прочих HTTP-заголовков, влияющих на безопасность и производительность.

Как проверить сжатие и кеш: инструменты и Lighthouse

Настроить заголовки — половина дела, вторую составляет проверка. Есть несколько способов убедиться, что всё работает.

Через командную строку. Сравниваем длину ответа со сжатием и без него:

# Без сжатия
curl -sI 'https://example.ru/' | grep -i content-length

# Со сжатием
curl -sI -H 'Accept-Encoding: gzip' 'https://example.ru/' | grep -i content-length

Если вторая цифра заметно меньше — сжатие работает. Аналогично проверяем кэш:

curl -sI 'https://example.ru/' | grep -iE "cache-control|expires"

Через Lighthouse. Этот инструмент встроен в DevTools Chrome и даёт комплексную оценку. Откройте вклад Performance, запустите аудит — Lighthouse покажет, сколько ресурсов отдаётся со сжатием, какие заголовки кэша присутствуют и насколько ускорится повторная загрузка. Отдельный раздел Review Insights проверяет наличие Cache-Control для кэшируемых активов.

Через онлайн-сервисы. Есть публичные проверки GZIP и заголовков кэша по URL — удобно, когда нужно быстро глянуть чужой сайт без установки чего-либо локально. Они сразу показывают Content-Encoding и значения Cache-Control.

Сводная таблица, что и как проверять:

Параметр Что смотреть Инструмент
Сжатие Content-Encoding: gzip curl, DevTools, онлайн-проверка
Уровень сжатия Разница Content-Length curl
Кэш статики Cache-Control, Expires curl, Lighthouse
Повторная загрузка Время без сети Lighthouse Performance

Типичные ошибки: не сжаты изображения и нет кеша для статики

На практике оптимизация скорости часто упирается в одни и те же недоработки. Перечислю самые частые.

1. Сжатие того, что уже сжато. Изображения в JPG, PNG, WebP, шрифты woff2/ttf, PDF и медиафайлы уже сжаты алгоритмами со потерями или без. Пытаться сжимать их снова через Gzip бессмысленно — файл почти не уменьшится, а процессор будет работать вхолостую. Сжимать нужно только текст: HTML, CSS, JavaScript, JSON, XML и SVG.

2. Отключение кэша для статики. Если стили и скрипты помечены как no-cache, браузер будет скачивать их заново на каждой странице. Это главная причина, почему сайт «тормозит» даже со включённым Gzip. Статике нужен долгий кэш, HTML — без кэша.

3. Слишком маленький gzip_min_length. Если сжимать файлы меньше 1 КБ, накладные расходы превысят пользу. Для маленьких ресурсов лучше оставить исходный размер.

4. Забытая директива Vary: Accept-Encoding. Без неё прокси-серверы и CDN могут отдать несжатый файл браузеру, который сжатие поддерживает. В nginx это решает gzip_vary on, о которой говорилось выше.

5. Проверка только одного параметра. Часто включают Gzip и забывают о кэше, или наоборот. А ведь вместе они дают синергию: сжатие экономит трафик при первой загрузке, кэш — вообще исключает повторную на повторах.

Отдельного внимания заслуживает проверка robots.txt: неправильно закрытые от индексации ресурсы могут не попасть в обработку и выглядеть как ошибка, хотя технически всё настроено. Подробнее — в статье про robots.txt: как настроить и читать.

Как проверить в seoquest.ru (/check/free)

Все перечисленные пункты удобно свести в одну проверку. Бесплатная проверка сайта на seoquest.ru оценивает сжатие как один из ключевых параметров Health Score: если Gzip не включён, это заметный минус, а размер страницы после сжатия должен быть в 3–5 раз меньше исходного. Сервис показывает и заголовки кэша — так вы сразу видите, где статика не кэшится, а где HTML случайно «завис» в кэше.

Что получится после проверки:

  • чёткий список, какие ресурсы не сжаты;
  • рекомендации по заголовкам Cache-Control и Expires;
  • общая оценка скорости, которую можно сравнить до и после настройки.

Это удобнее, чем гадать по отдельным заголовкам: один отчёт объединяет данные о сжатии, кэше и размере страницы. Попробовать можно без регистрации — инструмент доступен в бесплатной проверке.

Итог

Gzip и кеширование — самый простой и дешёвый способ ускорить сайт. Сжатие уменьшает вес HTML, CSS и JavaScript в 3–5 раз, а кэш избавляет браузер от повторных запросов одной и той же статики. Настройка занимает минуты: несколько строк в конфиге nginx или файле .htaccess, проверка через curl или Lighthouse и финальная оценка в бесплатной проверке seoquest.ru. Результат — быстрее открывающиеся страницы, ниже отказы и выше позиции в поиске.

Хотите убедиться, что на вашем сайте всё настроено правильно? Проверьте сайт бесплатно и посмотрите раздел скорости в своём аудите — сервис покажет, где не хватает сжатия и кэша.

Часто задаваемые вопросы

Нужно ли сжимать изображения через Gzip?

Нет. Картинки в JPG, PNG, WebP уже сжаты отдельными алгоритмами. Сжимать нужно только текст: HTML, CSS, JavaScript, JSON, XML и SVG. Для картинок лучше использовать современные форматы вроде WebP.

Влияет ли сжатие на нагрузку на сервер?

Да, но незначительно. Уровень 6 — оптимальный баланс между размером файла и расходом процессора. На современных серверах нагрузка почти незаметна.

Что выбрать: Gzip или Brotli?

Настройте оба. Современный nginx сам выберет: если браузер поддерживает Brotli — отдаст его (он сжимает на 15–20% лучше), иначе переключится на Gzip как fallback.

Как понять, что кэш настроен правильно?

HTML должен отдаваться без долгого кэша (no-cache), а статика — изображения, стили и скрипты — с max-age в несколько месяцев или лет. Проверить заголовки можно через curl или Lighthouse.

Сколько времени занимает настройка?

Пять минут: добавить директивы в конфиг сервера, перезапустить его и проверить ответ через curl -sI. Эффект от этого — мгновенный.