Gzip vs Brotli: сравнение веб-компрессии
Почему компрессия важна
Каждый байт, переданный по сети, стоит времени. JavaScript-бандл 500 КБ загружается 100 мс на соединении 40 Мбит/с — но сжатый до 150 КБ с Brotli загружается всего 30 мс. Умножьте на все ресурсы (HTML, CSS, JS, JSON, SVG) — компрессия может сократить время загрузки на 50–70%.
Веб-компрессия находит избыточные паттерны в текстовых файлах и заменяет их короткими представлениями. И Gzip, и Brotli — без потерь: оригинальные данные идеально восстанавливаются на стороне клиента. Браузер указывает поддерживаемые кодировки через Accept-Encoding, сервер отвечает сжатой версией.
Gzip: устоявшийся стандарт
Gzip — стандартная веб-компрессия с середины 1990-х. Использует алгоритм DEFLATE (комбинация LZ77 и кодирования Хаффмана). Поддерживается всеми браузерами, серверами, CDN и прокси.
# Nginx: настройка Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml;
Уровни компрессии от 1 (быстрый, слабое сжатие) до 9 (медленный, максимальное сжатие). Уровень 6 — оптимальный баланс между степенью сжатия и нагрузкой на CPU.
Brotli: современная альтернатива
Brotli разработан Google и выпущен в 2015 году. Использует LZ77, кодирование Хаффмана и предустановленный словарь типичного веб-контента (HTML-теги, CSS-свойства, ключевые слова JavaScript). Этот словарь даёт Brotli значительное преимущество именно для веб-контента.
# Nginx: настройка Brotli (требует модуль ngx_brotli)
brotli on;
brotli_comp_level 6;
brotli_min_length 256;
brotli_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml;
Уровни Brotli от 0 до 11. Уровни 0–4 сопоставимы по скорости с Gzip. 5–9 значительно медленнее, но дают меньший размер. 10–11 — очень медленные, только для статической пре-компрессии.
Сравнение
| Характеристика | Gzip | Brotli |
|---|---|---|
| Алгоритм | DEFLATE (LZ77 + Хаффман) | LZ77 + Хаффман + статический словарь |
| Степень сжатия | Хорошая (базовый уровень) | На 15–25% лучше Gzip |
| Скорость сжатия | Быстрая на всех уровнях | Быстрая на 0–4, медленная на 10–11 |
| Скорость декомпрессии | Быстрая | Сопоставимая с Gzip |
| Поддержка браузерами | 100% | 97%+ (все современные) |
| Требуется SSL/TLS проверку | Нет | Да (браузеры поддерживают только через HTTPS) |
| Content-Encoding | gzip | br |
Реальные результаты сжатия
| Тип файла | Оригинал | Gzip (ур. 6) | Brotli (ур. 6) | Brotli (ур. 11) |
|---|---|---|---|---|
| jQuery 3.7 (min) | 87 КБ | 30 КБ (66%) | 27 КБ (69%) | 25 КБ (71%) |
| Bootstrap CSS (min) | 161 КБ | 23 КБ (86%) | 19 КБ (88%) | 17 КБ (89%) |
| HTML-страница (средн.) | 50 КБ | 12 КБ (76%) | 10 КБ (80%) | 9 КБ (82%) |
| JSON API документацию-ответ | 100 КБ | 15 КБ (85%) | 12 КБ (88%) | 11 КБ (89%) |
Статическая пре-компрессия
Для статических ассетов (CSS, JS, SVG) сжимайте файлы при сборке с максимальной степенью. Сервер отдаёт пре-сжатый файл без компрессии на каждый запрос:
# Пре-компрессия при сборке
gzip -9 -k dist/app.js # Создаёт app.js.gz
brotli -q 11 dist/app.js # Создаёт app.js.br
# Nginx автоматически отдаёт пре-сжатые файлы
gzip_static on; # Отдавать .gz если существует
brotli_static on; # Отдавать .br если существует
Лучшее из обоих миров: максимальная степень сжатия (Brotli уровень 11) без нагрузки на CPU при отдаче. Пайплайн сборки должен генерировать и .gz, и .br версии каждого статического ассета.
Что НЕ нужно сжимать
- Изображения (JPEG, PNG, WebP, AVIF) — уже сжаты форматом. Повторное сжатие тратит CPU и может увеличить размер
- Видео и аудио (MP4, WebM, MP3) — уже сжаты
- Архивы (ZIP, tar.gz) — уже сжаты
- Очень маленькие файлы (<150 байт) — overhead сжатия превышает экономию. Задайте
gzip_min_length 256 - Шрифты (WOFF2) — уже сжаты Brotli. WOFF сжат Gzip
Лучшие практики настройки
- Включите оба — Brotli как основной, Gzip как запасной. Браузеры с Brotli получают меньшие файлы; старые клиенты — Gzip
- Динамический контент: уровень 4–6 — для HTML, JSON и API-ответов используйте умеренное сжатие. Здесь важна нагрузка на CPU
- Статический контент: максимальный уровень — пре-компрессия на уровне 9 (Gzip) / 11 (Brotli) и отдача с
*_static on - Устанавливайте Vary: Accept-Encoding — указывает кэшам хранить отдельные версии для разных кодировок
- Тестируйте на реальном контенте — степень сжатия зависит от типа контента. Проверяйте ваши реальные ассеты
Проверка компрессии
# Проверка с помощью curl
curl -I -H "Accept-Encoding: br,gzip" https://example.com/
# Ищите: Content-Encoding: br (или gzip)
# Используйте проверку HTTP-заголовков в Enterno.io
# для верификации Content-Encoding на любом URL
Заключение
Brotli — лучший выбор для веб-компрессии: даёт файлы на 15–25% меньше Gzip для типичного веб-контента с сопоставимой скоростью декомпрессии. Используйте Brotli как основную кодировку с Gzip как запасной. Пре-сжимайте статику на максимальном уровне, используйте умеренные уровни для динамического контента и всегда проверяйте активность компрессии через заголовки ответов. Эта единственная оптимизация может значительно сократить расход трафика и улучшить время загрузки.
Проверьте ваш сайт прямо сейчас
Проверить →