Как включить Brotli в Nginx на CentOS 8

Brotli — универсальный алгоритм без потерь, разработанный Google как более плотная альтернатива Gzip/Zopfli/Deflate. Он сочетает современный вариант LZ77, кодирование Хаффмана и контекстное моделирование второго порядка, обеспечивая сжатие, сопоставимое с лучшими общими методами. По скорости Brotli близок к deflate, но чаще даёт меньший размер.
Brotli распространяется под лицензией MIT. Встроенной официальной поддержки в Nginx нет, но есть модуль ngx_brotli от Google, который позволяет добавить поддержку в Nginx.
Этот гид показывает, как включить Brotli на сервере CentOS 8.
Важно: в примерах используется пользователь johndoe и домен example.com. Замените их на свои значения.
Что понадобится
- Сервер с CentOS 8
- Nginx версии 1.11.5 или выше (мы используем mainline-пакет)
- Доменное имя с записями A/AAAA
- TLS-сертификат (мы получим его через acme.sh от Let’s Encrypt)
Краткая методология установки
- Обновить систему и установить полезные пакеты.
- Установить acme.sh и получить RSA и ECDSA сертификаты.
- Установить Nginx из официального репозитория (mainline).
- Скачать исходники Nginx точно той же версии и собрать ngx_brotli как динамическую библиотеку.
- Подключить модули в nginx.conf и настроить виртуальный хост с HTTPS и brotli.
Шаг 0 — подготовка системы
Проверка версии CentOS:
cat /etc/centos-release
# CentOS Linux release 8.0.1905 (Core)Установка временной зоны (замените ‘Region/City’ на свой регион):
timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'Обновите пакеты:
sudo dnf update -yУстановите базовые утилиты и инструменты сборки:
sudo dnf install -y curl wget vim git unzip socat bash-completion epel-release socat && sudo dnf groupinstall "Development Tools"Шаг 1 — Установка acme.sh и получение сертификата Let’s Encrypt
Brotli требует HTTPS для практического использования (браузеры отправляют компрессируемые ответы только по HTTPS в большинстве сценариев). Получим сертификаты с помощью acme.sh.
Установка acme.sh:
sudo mkdir /etc/letsencrypt
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
sudo ./acme.sh --install --home /etc/letsencrypt --accountemail [email protected]
cd ~
source ~/.bashrcПроверка версии:
acme.sh --version
# v2.8.6Запрос RSA и ECDSA сертификатов для example.com:
# RSA 2048
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --accountemail [email protected] --ocsp-must-staple --keylength 2048
# ECDSA/ECC P-256
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --accountemail [email protected] --ocsp-must-staple --keylength ec-256После этого сертификаты будут в:
- RSA: /etc/letsencrypt/example.com
- ECC/ECDSA: /etc/letsencrypt/example.com_ecc
Совет: настройте автоматическое продление acme.sh (acme.sh сам умеет устанавливать крон/timers при инсталляции).
Шаг 2 — Установка Nginx из официального репозитория (mainline)
Установим mainline-версию Nginx, чтобы иметь доступ к новейшим возможностям и совпадающим исходникам.
Установите yum-utils:
sudo yum install yum-utilsСоздайте файл /etc/yum.repos.d/nginx.repo со следующим содержимым (приведено в оригинале). По умолчанию используется stable, но нам нужен mainline:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=trueВключите mainline-репозиторий и установите nginx:
sudo yum-config-manager --enable nginx-mainline
sudo yum install -y nginxПроверка версии:
sudo nginx -v
# nginx version: nginx/1.17.8Включите и запустите сервис:
sudo systemctl enable nginx.service
sudo systemctl start nginx.serviceШаг 3 — Сборка модуля Brotli (ngx_brotli) как динамической библиотеки
С Nginx 1.11.5 стало возможно собирать динамические модули отдельно от полного билда Nginx. Соберём ngx_brotli как динамический модуль.
Скачайте исходники той же версии Nginx, что и установленная (обязательно совпадение версий):
wget https://nginx.org/download/nginx-1.17.8.tar.gz && tar zxvf nginx-1.17.8.tar.gzУдалите архив, если хотите:
rm nginx-1.17.8.tar.gzКлонируйте ngx_brotli и инициализируйте сабмодули:
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli && git submodule update --init && cd ~Перейдите в директорию исходников Nginx:
cd ~/nginx-1.17.8Установите зависимости для сборки:
sudo dnf install -y pcre pcre-devel zlib zlib-devel openssl openssl-develСоберите модуль и скопируйте результат в /etc/nginx/modules:
./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules
sudo cp objs/*.so /etc/nginx/modulesПроверьте список файлов в /etc/nginx/modules — вы должны увидеть:
ls /etc/nginx/modulesУстановите права 644 для .so:
sudo chmod 644 /etc/nginx/modules/*.soШаг 4 — Настройка Nginx для Brotli
Подключите модули в /etc/nginx/nginx.conf, добавив в начало файла:
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;Проверьте конфигурацию:
sudo nginx -tСоздайте документ-рут и простой index.html:
sudo mkdir -p /var/www/example.com
sudo -s
echo "Hello from example.com" >> /var/www/example.com/index.html
exitСоздайте виртуальный хост /etc/nginx/conf.d/example.com.conf со следующим содержимым (замените example.com и пути при необходимости):
server {
listen 80;
server_name example.com; # Replace with your domain name
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com; # Replace with your domain name
root /var/www/example.com; # Replace with your document root
# RSA
ssl_certificate /etc/letsencrypt/example.com/fullchain.cer;
ssl_certificate_key /etc/letsencrypt/example.com/example.com.key;
# ECDSA
ssl_certificate /etc/letsencrypt/example.com_ecc/fullchain.cer;
ssl_certificate_key /etc/letsencrypt/example.com_ecc/example.com.key;
brotli on;
brotli_static on;
brotli_types text/plain text/css text/javascript application/javascript text/xml application/xml image/svg+xml application/json;
}Проверка конфигурации и перезагрузка:
sudo nginx -t
sudo systemctl reload nginx.serviceОткройте сайт в браузере и в панели разработчика проверьте заголовки ответа — вы должны увидеть Content-Encoding: br. Это подтверждает, что Brotli работает.

Критерии приёмки
- Nginx успешно загружает модули ngx_http_brotli_filter_module.so и ngx_http_brotli_static_module.so (nginx -t без ошибок).
- Запрос к сайту по HTTPS возвращает заголовок Content-Encoding: br для типовых текстовых/JSON/JS/CSS ответов.
- Сертификаты в /etc/letsencrypt корректно расположены и не просрочены.
Когда Brotli не подходит
- Если у вас очень старые клиенты/браузеры без поддержки Brotli — следует оставить gzip как fallback (включите gzip и brotli одновременно).
- Для уже сжатых двоичных форматов (JPEG, MP3, MP4) Brotli не даст существенного выигрыша. Не включайте эти типы в brotli_types.
- На системах с ограниченными CPU-ресурсами высокие уровни сжатия (высокие значения quality) могут увеличить нагрузку. В таких случаях используйте компромисс между скоростью и плотностью.
Альтернативные подходы
- Gzip: широко поддерживается, проще в настройке, но обычно даёт худшую степень сжатия по сравнению с Brotli.
- Zopfli: улучшает качество gzip-сжатия, но очень медленный при сжатии (подходит для статического контента при сборке).
- Серверные CDN/Reverse прокси: многие CDN (Cloudflare, Fastly и др.) поддерживают Brotli на своей стороне, что снимает нагрузку с вашего сервера.
Роль‑ориентированные чек‑листы
Для администратора:
- Обновить систему и установить зависимости.
- Получить сертификаты и настроить автоматическое продление.
- Установить mainline Nginx и убедиться в совпадении версии с исходниками.
- Собрать модуль и задать правильные права.
- Протестировать и перезапустить сервис.
Для разработчика/вебмастера:
- Проверить, что важные ресурсы (CSS, JS, JSON) отдаются с Content-Encoding: br.
- Убедиться в корректных заголовках Vary и cache-control.
- Настроить fallback на gzip для устаревших клиентов.
Мини‑методология оптимальной настройки
- Используйте brotli_static для предварительно сжатого контента (файлы .br рядом с исходниками).
- Для динамического ответа настройте brotli on и brotli_types для текстовых типов.
- Не включайте двоичные форматы и большие мультимедиа в список типов.
- Мониторьте CPU и время ответа при изменении настроек качества сжатия.
Краткий словарь терминов
- Brotli — алгоритм сжатия без потерь.
- ngx_brotli — модуль Nginx от Google для Brotli.
- brotli_static — директива Nginx для отдачи предварительно сжатых .br файлов.
- brotli_types — список MIME-типов, которые Nginx будет сжимать Brotli.
Примеры конфигураций и тесты приёмки
Тест приёмки: выполните curl с поддержкой Brotli и проверьте заголовки.
curl -I -H "Accept-Encoding: br" https://example.comОжидаемый ответ: в заголовках присутствует Content-Encoding: br. Если нет — проверьте, загружены ли модули и корректна ли директива brotli_types.
Примечания и рекомендации
Важно: версии исходников Nginx и установленных пакетов должны совпадать, иначе сборка модуля может завершиться с ошибкой. Если ваш сервер обслуживается через CDN, рассмотрите вариант включения Brotli на CDN‑уровне — это упростит конфигурацию.
Ссылки
- https://brotli.org/
- https://github.com/google/brotli
- https://github.com/google/ngx_brotli
- https://en.wikipedia.org/wiki/Brotli
Краткое резюме
Brotli даёт более плотное сжатие, чем gzip, и его можно включить в Nginx через динамический модуль ngx_brotli. На CentOS 8 процесс состоит из получения TLS‑сертификатов, установки mainline‑Nginx, сборки модуля и включения директив в конфигурации Nginx. После завершения проверяйте заголовки ответов и нагрузку на CPU.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента