Сжатие Gzip и Brotli — самый дешёвый способ ускорить сайт: пять минут настройки, и текстовые файлы «худеют» на 70–85%. HTML-страница в 100 КБ уезжает к посетителю в 15–20 КБ, CSS- и JS-бандлы сжимаются в 4–5 раз, а вместе с ними растут и оценки в PageSpeed Insights. В этой статье включим сжатие gzip в Nginx, добавим более эффективный Brotli, настроим статическое предсжатие и проверим результат через curl. Все команды актуальны для Ubuntu 24.04 LTS со штатным Nginx из репозитория.
Как работает сжатие и что оно даёт
Механика простая. Браузер в каждом запросе присылает заголовок Accept-Encoding: gzip, deflate, br, zstd — список алгоритмов, которые он понимает. Сервер сжимает ответ одним из них и указывает выбранный в заголовке Content-Encoding. Браузер распаковывает на лету — для пользователя всё прозрачно, страница просто грузится быстрее.
Типичные цифры для текстовых файлов:
- HTML — сжатие в 4–6 раз (например, 120 КБ → 22 КБ);
- CSS — в 4–5 раз;
- JavaScript — в 3–5 раз;
- JSON-ответы API — в 5–10 раз;
- SVG — в 2–4 раза.
Выгода двойная: посетитель получает страницу быстрее (особенно на мобильном интернете), а канал сервера передаёт меньше байтов — на том же VPS помещается больше одновременных посетителей. Если Nginx у вас ещё не установлен, начните со статьи об установке и базовой настройке Nginx на Ubuntu, а затем возвращайтесь.
Включаем Gzip в Nginx
В Ubuntu 24.04 Gzip в Nginx включён по умолчанию, но в минимальном виде: сжимается только text/html. CSS, JS и JSON летят несжатыми. Исправим. Откройте /etc/nginx/nginx.conf и приведите блок gzip внутри http { } к такому виду:
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
text/plain
text/css
text/javascript
text/xml
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml;
Что означают ключевые директивы:
gzip_comp_level 5— уровень сжатия от 1 до 9. Уровни 4–6 — золотая середина: выше почти нет выигрыша в размере, зато заметно растёт нагрузка на CPU;gzip_min_length 256— файлы меньше 256 байт не сжимаем: они и так помещаются в один пакет;gzip_vary on— добавляет заголовокVary: Accept-Encoding, чтобы прокси и CDN не отдали сжатую версию клиенту без поддержки сжатия;gzip_proxied any— сжимать и ответы, проходящие через прокси;gzip_types— список MIME-типов (типtext/htmlуказывать не нужно — он сжимается всегда).
Проверяем и применяем:
sudo nginx -t
sudo systemctl reload nginx
Brotli: сжатие плотнее на 15–25%
Brotli — алгоритм от Google, созданный специально для веба. За счёт встроенного словаря из типичных веб-конструкций он сжимает HTML, CSS и JS на 15–25% плотнее Gzip при сопоставимой скорости распаковки. Его поддерживают все современные браузеры, но с одной оговоркой: только по HTTPS. Если у вас ещё нет сертификата, выпустите бесплатный по инструкции про Let's Encrypt и автопродление.
В Ubuntu 24.04 модули Brotli для штатного Nginx ставятся из репозитория одной командой — компилировать ничего не нужно:
sudo apt update
sudo apt install -y libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static
Пакеты автоматически подключают модули через каталог /etc/nginx/modules-enabled/. Осталось добавить настройки в блок http { } файла /etc/nginx/nginx.conf:
brotli on;
brotli_comp_level 5;
brotli_min_length 256;
brotli_types
text/plain
text/css
text/javascript
text/xml
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml;
И снова: sudo nginx -t && sudo systemctl reload nginx. Теперь Nginx сам выберет алгоритм: клиентам с поддержкой Brotli отдаст br, остальным — gzip. Важный нюанс: если вы ставили Nginx не из репозитория Ubuntu, а из официального репозитория nginx.org, эти модули не подойдут по ABI — для такой сборки Brotli собирается из исходников ngx_brotli под вашу версию.
Статическое предсжатие: максимум экономии без нагрузки на CPU
Сжимать один и тот же файл при каждом запросе — расточительно. Для статики (JS-бандлы, CSS, шрифтовые SVG) есть приём лучше: сжать файлы один раз на диске максимальным уровнем, а Nginx будет просто отдавать готовые .gz и .br версии. Включается двумя директивами:
gzip_static on;
brotli_static on;
Подготовить сжатые копии можно утилитами из репозитория:
sudo apt install -y brotli
cd /var/www/site/assets
gzip -k -9 app.js
brotli -k -q 11 app.js
# получатся app.js.gz и app.js.br рядом с оригиналом
Флаг -k сохраняет исходный файл. Здесь уже можно использовать максимальные уровни (gzip 9, brotli 11): сжатие происходит один раз при деплое, а не на каждый запрос. В сборщиках фронтенда то же самое делают плагины compression для Vite/Webpack. Этот приём особенно полезен связке с кешированием WordPress — подробнее в статье о том, как ускорить WordPress.
Что сжимать не нужно
Форматы, уже сжатые своими алгоритмами, повторно сжимать бессмысленно — экономия 0–2%, а CPU тратится:
- изображения: JPEG, PNG, WebP, AVIF, GIF;
- видео и аудио: MP4, WebM, MP3;
- шрифты WOFF и WOFF2 (внутри уже Brotli);
- архивы: ZIP, GZ, 7z.
Поэтому их MIME-типы в gzip_types и brotli_types не добавляем. И ещё один нюанс: динамическое сжатие ответов по HTTPS теоретически уязвимо к атаке BREACH, если на странице есть секретные токены рядом с данными, которые контролирует атакующий. Для типичного сайта риск минимален, но секретные API-эндпоинты с CSRF-токенами иногда осознанно исключают из сжатия.
Gzip против Brotli: сводная таблица
| Критерий | Gzip | Brotli |
|---|---|---|
| Степень сжатия текста | В 3–6 раз | На 15–25% плотнее Gzip |
| Поддержка клиентов | Практически 100% | Все современные браузеры, только HTTPS |
| Установка в Ubuntu 24.04 | Встроен в Nginx | Пакеты libnginx-mod-http-brotli-* |
| Уровень для сжатия на лету | 4–6 | 4–6 |
| Уровень для предсжатия статики | 9 | 11 |
Проверяем результат
Убедимся, что сервер действительно отдаёт сжатый контент. Запрашиваем заголовки с разными Accept-Encoding:
# Проверка Brotli
curl -sI -H "Accept-Encoding: br" https://ваш-сайт.ru/ | grep -i content-encoding
# content-encoding: br
# Проверка Gzip
curl -sI -H "Accept-Encoding: gzip" https://ваш-сайт.ru/ | grep -i content-encoding
# content-encoding: gzip
Сравнить размер до и после можно так:
curl -so /dev/null -w "Без сжатия: %{size_download} байт\n" https://ваш-сайт.ru/
curl -so /dev/null -H "Accept-Encoding: br" -w "Brotli: %{size_download} байт\n" https://ваш-сайт.ru/
В браузере то же самое видно в DevTools → Network: колонка Size покажет переданный объём, а в заголовках ответа будет content-encoding. Кстати, сжатие отлично дополняется мультиплексированием запросов — если ещё не включили современные протоколы, загляните в инструкцию по HTTP/2 и HTTP/3 в Nginx: вместе они дают наибольший прирост скорости.
Небольшой практический штрих: скорость отдачи зависит не только от сжатия, но и от того, как быстро сервер читает файлы и хватает ли CPU на компрессию под нагрузкой. На VPS от Cheap-Host даже младший тариф Start (450 ₽/мес, 6 vCPU, 8 ГБ RAM) держит сжатие на лету без заметной нагрузки, а NVMe-диски отдают предсжатую статику практически мгновенно. Канал 100 Мбит/с с безлимитным трафиком означает, что за объём отданных гигабайт доплачивать не придётся.
FAQ
Что лучше — Gzip или Brotli?
Brotli сжимает на 15–25% плотнее при сопоставимой скорости распаковки. Но включать стоит оба: Brotli — для современных браузеров, Gzip — запасной вариант для старых клиентов, ботов и HTTP без TLS.
Почему браузер получает Gzip, хотя Brotli включён?
Браузеры запрашивают Brotli только по HTTPS. Если сайт открыт по HTTP, в Accept-Encoding будет только gzip. Установите SSL-сертификат — и Brotli заработает.
Нужно ли сжимать картинки и видео?
Нет. JPEG, PNG, WebP, MP4 и WOFF2 уже сжаты. Повторное сжатие даст 0–2% экономии и зря потратит процессор. Сжимайте только текстовые форматы.
Сильно ли сжатие нагружает CPU?
На уровнях 4–6 нагрузка незаметна даже на недорогом VPS. Максимальные уровни (brotli 9–11) применяйте только для предсжатия статики на диске.
Вывод
Итог простой: включите Gzip с расширенным списком gzip_types, добавьте Brotli из пакетов Ubuntu 24.04, а для статики настройте предсжатие с gzip_static и brotli_static. Полчаса работы — и сайт отдаёт на 70–85% меньше байтов, быстрее открывается и легче переносит наплывы трафика. Если для экспериментов или боевого проекта нужен сервер — у Cheap-Host тариф Start от 450 ₽/мес: NVMe, KVM, 8 ГБ RAM, безлимитный трафик и автодеплой за 45–60 секунд, так что проверить весь этот конфиг можно уже через минуту после оплаты.