Сжатие на стороне веб-сервера ускоряет доставку HTML, CSS и JS, экономит трафик и улучшает показатели Core Web Vitals. Практическое правило простое: включаем gzip как базовую совместимость и добавляем Brotli там, где его понимает браузер. Сервер сам отдаст Brotli клиентам с поддержкой, остальным вернет gzip.
Краткий план:
- Включаем оба алгоритма.
- Отдаем Brotli с приоритетом, если клиент его просит.
- Не сжимаем уже сжатые форматы.
- Ставим заголовок Vary: Accept-Encoding, чтобы кэши не путали варианты.
- Проверяем через curl заголовок Content-Encoding.
Что сжимать, а что нет
- Сжимать: text/html, text/css, application/javascript, application/json, application/xml, image/svg+xml, application/manifest+json.
- Не сжимать: jpg, png, webp, avif, gif, mp4, mkv, zip, gz, br, 7z, rar, woff2.
- Допустимо сжимать ttf, otf и woff, но выигрыш небольшой.
Подключение Brotli к Nginx | Ubuntu и Debian
1. Установка модулей Brotli и утилит
На актуальных Ubuntu и Debian модули Brotli для Nginx доступны как пакеты динамических модулей. Устанавливаем фильтр и статический модуль, а также CLI-утилиту для предсжатия статики:
sudo apt update
sudo apt install -y libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static brotli
*Пакеты libnginx-mod-http-brotli-* имеются в официальных репозиториях Ubuntu 22.04/24.04 и Debian 12+, устанавливаются как динамические модули Nginx.
Проверьте, что в /etc/nginx/nginx.conf подключена строка для динамических модулей:
include /etc/nginx/modules-enabled/*.conf;
Если ее нет, добавьте и перезапустите Nginx.
2. Включение gzip и Brotli в конфигурации
Откройте главный конфиг /etc/nginx/nginx.conf или файл в conf.d и добавьте в блок http:
# Gzip
gzip on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_vary on;
gzip_proxied any;
gzip_disable "msie6";
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
application/atom+xml
application/manifest+json
image/svg+xml;
# Brotli (нужен установленный модуль)
brotli on;
brotli_comp_level 6;
brotli_min_length 256;
brotli_static on;
brotli_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
application/atom+xml
application/manifest+json
image/svg+xml;
* Директивы brotli и brotli_static относятся к модулям фильтра и статического Brotli соответственно. Можно держать brotli off; и при этом оставить brotli_static on;, если используете только предсжатые .br файлы.
Применяем конфиг:
sudo nginx -t && sudo systemctl reload nginx
3. Предсжатие статики (.gz и .br)
Рекомендуется предсжимать статические файлы на этапе сборки, чтобы не грузить CPU в рантайме:
# Gzip предсжатие
find /var/www/site -type f -regextype posix-extended -regex '.*\.(html|css|js|json|xml|svg)$' -exec gzip -k -f -9 {} \;
# Brotli предсжатие
find /var/www/site -type f -regextype posix-extended -regex '.*\.(html|css|js|json|xml|svg)$' -exec brotli -f -Z {} \;
И убедитесь, что включены:
gzip_static on;
brotli_static on;
4. Проверка сжатия
curl -I -H 'Accept-Encoding: br' https://ваш-домен/путь/к/файлу.css | grep -i content-encoding
curl -I -H 'Accept-Encoding: gzip' https://ваш-домен/ | grep -i content-encoding
Должно вернуться Content-Encoding: br для первого и gzip для второго.
5. Частые ошибки и решения
- Нет заголовка Content-Encoding
Проверьте, не попали ли правила внутрь неправильного server или location. Убедитесь, что тип контента входит в *_types.
- Браузер получает .br, но рендер ломается
Убедитесь, что .br создан из исходного файла, а не повторно сжат из .gz. Включайте только gzip_static on; brotli_static on; и держите оригиналы рядом.
- Высокая нагрузка CPU
Уменьшите *_comp_level до 4–5 и включите предсжатие для тяжелых файлов.
- Nginx не стартует после установки модулей
Проверьте, что в конфиге подключены modules-enabled/*.conf и нет дублирующих load_module.
Brotli подключение на Apache | Ubuntu и Debian
1. Включение модулей
Активируем gzip через mod_deflate, Brotli через mod_brotli, а также headers и filter:
sudo a2enmod deflate brotli headers filter
sudo systemctl reload apache2
- mod_brotli официальный для Apache 2.4, доступен в сборках Debian/Ubuntu и использует библиотеку Google Brotli.
2. Конфигурация сжатия
Создайте файл /etc/apache2/conf-available/compression.conf:
# Включаем gzip
AddOutputFilterByType DEFLATE \
text/plain text/html text/css text/javascript application/javascript \
application/json application/xml image/svg+xml application/manifest+json
# Включаем Brotli
AddOutputFilterByType BROTLI_COMPRESS \
text/plain text/html text/css text/javascript application/javascript \
application/json application/xml image/svg+xml application/manifest+json
# Качество Brotli
BrotliCompressionQuality 6
BrotliWindowSize 22
# Не сжимаем уже сжатые форматы
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png|webp|avif|mp4|mkv|zip|gz|br|7z|rar|woff2)$" no-compress
SetEnvIfNoCase no-compress 1 no-gzip
SetEnvIfNoCase no-compress 1 no-brotli
# Правильный кэш-вариант
Header append Vary "Accept-Encoding"
Активируйте и примените:
sudo a2enconf compression
sudo apachectl configtest && sudo systemctl reload apache2
3. Проверка
curl -I -H 'Accept-Encoding: br' https://ваш-домен/ | grep -i content-encoding
curl -I -H 'Accept-Encoding: gzip' https://ваш-домен/ | grep -i content-encoding
Частые ошибки и решения
- BROTLI_COMPRESS не работает:
Убедитесь, что модуль включен: apache2ctl -M | grep brotli. Если нет, повторите a2enmod brotli. 
- Конфликт с кэшем:
Добавьте Header append Vary "Accept-Encoding", чтобы CDN и браузеры различали варианты.
- Файл уже сжат:
Проверьте исключения через SetEnvIfNoCase, чтобы не сжимать *.br, *.gz, *.woff2.
- Когда лучше предсжимать файлы, а не сжимать «на лету»:
- Статика большого размера и высокого трафика лучше отдается из предсжатых .gz и .br. Это разгружает CPU и дает максимальное качество сжатия.
- Динамические ответы (HTML от приложения) логично сжимать на лету.
Диагностика и контрольные команды
- Проверить поддержку типов в Nginx
Убедитесь, что нужный MIME указывает *_types.
- Проверить, что Brotli модуль загружен в Nginx
nginx -V 2>&1 | grep -i brotli или проверьте наличие файлов в /etc/nginx/modules-enabled/ после установки пакетов. 
- Тест производительности локально
curl -s -H 'Accept-Encoding: br' -w '%{size_download}\n' -o /dev/null https://ваш-домен/файл.css
Полезные параметры по умолчанию
- Уровень компрессии 6 дает хороший баланс скорости и размера. Для нагруженных систем начните с 4–5.
- Минимальная длина 256 байт избавляет от бессмысленного сжатия крошечных ответов.
- Список типов должен покрывать HTML, CSS, JS, JSON, XML и SVG.
Удаление или откат настроек
- Отключить Brotli в Nginx
Замените brotli on;
на brotli off;
и перезагрузите, оставив brotli_static on;
если используете предсжатие.
- Отключить Brotli в Apache
sudo a2dismod brotli && sudo systemctl reload apache2
- Полное удаление модулей Brotli Nginx
sudo apt remove -y libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static