Гид по технологиям

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

• 5 min read • DevOps • Обновлено 22 Nov 2025
Brotli в Nginx на CentOS 8 — настройка и проверка
Brotli в Nginx на CentOS 8 — настройка и проверка

Логотип Brotli и Nginx на скриншоте конфигурации

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)

Краткая методология установки

  1. Обновить систему и установить полезные пакеты.
  2. Установить acme.sh и получить RSA и ECDSA сертификаты.
  3. Установить Nginx из официального репозитория (mainline).
  4. Скачать исходники Nginx точно той же версии и собрать ngx_brotli как динамическую библиотеку.
  5. Подключить модули в 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 работает.

Заголовки ответа с Content-Encoding: br на примере Nginx

Критерии приёмки

  • 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‑уровне — это упростит конфигурацию.

Ссылки

Краткое резюме

Brotli даёт более плотное сжатие, чем gzip, и его можно включить в Nginx через динамический модуль ngx_brotli. На CentOS 8 процесс состоит из получения TLS‑сертификатов, установки mainline‑Nginx, сборки модуля и включения директив в конфигурации Nginx. После завершения проверяйте заголовки ответов и нагрузку на CPU.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро