На странице про ускорение сайтов я написала, что самая частая находка — невключённое сжатие. Через день проверила собственный сервер и обнаружила ровно это. Рассказываю, потому что случай показательный.
Проверка занимает десять секунд. Запрашиваем файл дважды — с разрешением на сжатие и без него — и сравниваем размер:
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.css | 11 269 | 2 918 |
| sitemap.xml | 1 828 | 326 |
| Страница услуги | 22 414 | 6 368 |
CSS похудел вчетверо, карта сайта — впятеро. Всё это без единой правки в коде: только конфиг сервера.
Картинки, видео, архивы и шрифты в форматах woff и woff2 уже сжаты внутри себя. Прогонять их через gzip бессмысленно: выигрыша не будет, а процессорное время потратится на каждый запрос. Именно поэтому в списке типов только текстовые форматы.
Отдельно про font/woff2: иногда его добавляют в список «на всякий случай». Не стоит — формат уже использует внутреннее сжатие Brotli.
Две команды curl на каждый файл. Если размеры совпадают — у вас та же история, и чинится она одной строкой в конфиге.
Кстати, о том, почему в проверке нельзя доверять глазам: похожий случай с промокодом, где код был написан правильно, а вёл себя неверно.
Выполните две команды curl — с заголовком Accept-Encoding: gzip и без него — и сравните размер ответа. Если числа одинаковые, файл отдаётся без сжатия. Второй способ: посмотреть в заголовках ответа наличие Content-Encoding: gzip.
Директива 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 ₽