- html5css.dev
- SEO
- Мобильное SEO
- Скорость сайта
- Сжатие: Brotli и GZIP
Сжатие: Brotli и GZIP
Сжатие — самое выгодное соотношение усилий и результата в оптимизации скорости: одна настройка сервера уменьшает текстовые ресурсы в разы. Разбираем актуальную конфигурацию.
Что сжимать и насколько это помогает
| Тип | Сжимать | Типичный выигрыш |
|---|---|---|
| HTML | Да | в 5–8 раз |
| CSS | Да | в 6–8 раз |
| JavaScript | Да | в 3–4 раза |
| JSON, XML, sitemap | Да | в 5–10 раз |
| SVG | Да | в 3–5 раз |
| Шрифты WOFF2 | Нет | уже сжаты |
| JPEG, PNG, WebP, AVIF | Нет | уже сжаты |
| Видео, архивы, PDF | Нет | уже сжаты |
Конфигурация nginx
# --- Brotli (модуль ngx_brotli) ---
brotli on;
brotli_static on; # отдавать готовые .br, если есть
brotli_comp_level 5; # 4–6 для сжатия на лету
brotli_min_length 256;
brotli_types
text/plain text/css text/xml
application/javascript application/json
application/xml application/rss+xml
image/svg+xml;
# --- GZIP как запасной вариант ---
gzip on;
gzip_static on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_vary on;
gzip_proxied any;
gzip_types
text/plain text/css text/xml
application/javascript application/json
application/xml application/rss+xml
image/svg+xml;
text/htmlне указывают — nginx сжимает его всегда.- Уровень 4–6 для сжатия на лету: выше даёт мало, а нагрузку на процессор увеличивает заметно.
min_length256 — файлы мельче сжимать невыгодно.gzip_vary on— корректная работа с промежуточными кешами.
Статическое сжатие
Для файлов, которые не меняются между релизами, лучше подготовить сжатые версии заранее на сборке — с максимальным уровнем, поскольку время сжатия уже не важно:
# на сборке, рядом с исходниками
find dist -type f \( -name '*.js' -o -name '*.css' -o -name '*.svg' \) \
-exec brotli -f -q 11 -k {} \; \
-exec gzip -f -9 -k {} \;
При включённых brotli_static и gzip_static nginx отдаст
готовый файл, не тратя процессор на каждый запрос.
Проверка
# размер без сжатия и со сжатием
curl -s -o /dev/null -w 'без: %{size_download} байт\n' \
https://site.ru/css/main.css
curl -s -o /dev/null -H 'Accept-Encoding: br,gzip' \
-w 'со: %{size_download} байт\n' \
https://site.ru/css/main.css
# какой алгоритм применён
curl -sI -H 'Accept-Encoding: br,gzip' https://site.ru/ | grep -i content-encoding
В DevTools → Network колонка Size показывает два числа: переданный размер и распакованный. Если они совпадают — сжатие для этого ресурса не работает.
content-encoding для каждого типа
ресурса отдельно, а не только для главной страницы.
Сжатие и CDN
Если статика идёт через CDN, сжатие обычно включается в его настройках, а не на вашем сервере. Проверьте, что CDN:
- поддерживает Brotli, а не только GZIP;
- корректно кеширует разные варианты по
Vary: Accept-Encoding; - не пересжимает уже сжатые изображения.
Подробнее — в уроке об использовании CDN.
Итог
Сжатие — первая настройка, которую нужно проверить при работе над скоростью: она даёт кратное уменьшение текстовых ресурсов ценой одной правки конфигурации. Brotli основным, GZIP запасным, готовые файлы для неизменной статики, уже сжатые форматы не трогаем.
Частые вопросы
Brotli или GZIP?
Brotli как основной: на текстовых ресурсах он сжимает примерно на 15–20 % лучше GZIP. GZIP оставляют запасным для клиентов, которые Brotli не поддерживают. Сервер выбирает алгоритм сам по заголовку Accept-Encoding.
Какие файлы не нужно сжимать?
Уже сжатые: JPEG, PNG, WebP, AVIF, MP4, ZIP, PDF. Повторное сжатие не уменьшает размер, но тратит процессорное время, а иногда даже увеличивает файл.
Что такое статическое сжатие?
Заранее подготовленные файлы .br и .gz рядом с оригиналом. Сервер отдаёт готовый файл без сжатия на лету — быстрее и с максимальным уровнем сжатия.
Как проверить, что сжатие работает?
Запросом с заголовком Accept-Encoding и сравнением размера ответа, либо во вкладке Network в DevTools: колонка Size показывает переданный и распакованный размер.