vvs35.ru боты, парсеры, серверы
УслугиГотовые решенияБлог принимаем заказы

Сжатие работало только для HTML — и я нашла это на своём сайте

На странице про ускорение сайтов я написала, что самая частая находка — невключённое сжатие. Через день проверила собственный сервер и обнаружила ровно это. Рассказываю, потому что случай показательный.

Как я это нашла

Проверка занимает десять секунд. Запрашиваем файл дважды — с разрешением на сжатие и без него — и сравниваем размер:

curl -s -H "Accept-Encoding: gzip" -o /dev/null -w "%{size_download}\n" https://site.ru/style.css
curl -s -o /dev/null -w "%{size_download}\n" https://site.ru/style.css

Если числа разные — сжатие работает. Если одинаковые, как было у меня, — файл отдаётся целиком:

11269
11269

При этом HTML сжимался прекрасно: 22 414 байт превращались в 6 368. То есть gzip on в конфиге стоял, и по всем внешним признакам всё было в порядке.

Почему так вышло

Вот причина, и она встроена в стандартный конфиг Ubuntu. Директива gzip on сама по себе включает сжатие только для одного типа файлов — text/html. Это значение gzip_types по умолчанию.

Список остальных типов в конфиге есть, но закомментирован:

# Gzip Settings
gzip on;
# gzip_vary on;
# gzip_comp_level 6;
# gzip_types text/plain text/css application/json application/javascript ...

Владелец сайта открывает конфиг, видит gzip on, ставит галочку «сжатие настроено» и идёт дальше. А CSS, JavaScript, XML и JSON продолжают ездить без сжатия годами.

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

Как починить

Раскомментировать список типов и добавить пару разумных настроек:

gzip on;
gzip_min_length 256;
gzip_vary on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript
           text/xml application/xml application/xml+rss text/javascript
           image/svg+xml;

Что здесь что:

  • gzip_min_length 256 — не сжимать мелочь. Для файла в полсотни байт накладные расходы съедят выигрыш, а результат может оказаться больше оригинала.
  • gzip_vary on — добавляет заголовок Vary: Accept-Encoding, чтобы промежуточные кэши не отдали сжатый ответ клиенту, который сжатие не понимает.
  • gzip_comp_level 6 — компромисс. Девятый уровень нагружает процессор заметно сильнее, а выигрывает считаные проценты.
  • image/svg+xml — про SVG забывают чаще всего, а это текст, и сжимается он отлично.

Дальше проверка конфига и перезагрузка:

nginx -t && systemctl reload nginx

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

Файлбылостало
site.css11 2692 918
sitemap.xml1 828326
Страница услуги22 4146 368

CSS похудел вчетверо, карта сайта — впятеро. Всё это без единой правки в коде: только конфиг сервера.

Чего сжимать не надо

Картинки, видео, архивы и шрифты в форматах woff и woff2 уже сжаты внутри себя. Прогонять их через gzip бессмысленно: выигрыша не будет, а процессорное время потратится на каждый запрос. Именно поэтому в списке типов только текстовые форматы.

Отдельно про font/woff2: иногда его добавляют в список «на всякий случай». Не стоит — формат уже использует внутреннее сжатие Brotli.

Что проверить у себя прямо сейчас

  1. CSS и JavaScript — те самые файлы, которые обычно забывают.
  2. sitemap.xml — если он большой, выигрыш будет заметным.
  3. Ответы API, если сайт отдаёт JSON.
  4. SVG-иконки.

Две команды curl на каждый файл. Если размеры совпадают — у вас та же история, и чинится она одной строкой в конфиге.


Кстати, о том, почему в проверке нельзя доверять глазам: похожий случай с промокодом, где код был написан правильно, а вёл себя неверно.

Коротко: частые вопросы

Как проверить, сжимается ли файл на сайте?

Выполните две команды curl — с заголовком Accept-Encoding: gzip и без него — и сравните размер ответа. Если числа одинаковые, файл отдаётся без сжатия. Второй способ: посмотреть в заголовках ответа наличие Content-Encoding: gzip.

Почему gzip включён, но CSS не сжимается?

Директива gzip on включает сжатие только для типа text/html — это значение gzip_types по умолчанию. В конфигурации Ubuntu строка со списком типов закомментирована, поэтому CSS, JavaScript, XML и JSON отдаются без сжатия, хотя владелец сайта уверен, что gzip работает.

Насколько сжатие уменьшает файлы?

Текстовые файлы сжимаются в три-четыре раза. На нашем сайте CSS уменьшился с 11 269 до 2 918 байт, карта сайта — с 1 828 до 326 байт, HTML страницы — с 22 414 до 6 368 байт. Картинки и видео сжимать не нужно: они уже сжаты, и gzip только потратит процессорное время.

Нужно ли сжимать маленькие файлы?

Нет. Для файлов меньше нескольких сотен байт накладные расходы на сжатие сопоставимы с выигрышем, а иногда результат оказывается больше исходника. Разумный порог задаётся директивой gzip_min_length со значением около 256 байт.

Сайт грузится медленно, а причина непонятна? Сделаю замер до и после, покажу, что именно тормозит. Диагностика — 1 500 ₽, и отчёт остаётся у вас.

Ускорение сайта от 3 500 ₽

Читать дальше