Перейти к содержанию

Включите сжатие Brotli в NGINX

Сжимайте ваш контент на 15-25% лучше, чем gzip, с помощью алгоритма Brotli от Google.


  • 15-25% меньше


    Brotli достигает лучших коэффициентов сжатия, чем gzip для текстового контента

  • Универсальная поддержка


    Все современные браузеры поддерживают Brotli (Chrome, Firefox, Safari, Edge)

  • Быстрее загрузка страниц


    Меньшие файлы = более быстрые загрузки, особенно в мобильных сетях

  • Низкие затраты на трафик


    Снижайте затраты на передачу данных с помощью лучшего сжатия


Поддержка браузеров

Brotli поддерживается более чем 95% браузеров по всему миру:

Браузер Поддержка Brotli
Chrome ✅ С версии v50 (2016)
Firefox ✅ С версии v44 (2016)
Safari ✅ С версии v11 (2017)
Edge ✅ С версии v15 (2017)
Opera ✅ С версии v38 (2016)

NGINX автоматически переходит на gzip для более старых браузеров.


Быстрая настройка

Шаг 1: Установите модуль Brotli

# Установите репозиторий GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Установите модуль Brotli
dnf -y install nginx-module-brotli

Включите в /etc/nginx/nginx.conf:

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

Шаг 2: Настройте сжатие Brotli

Создайте /etc/nginx/conf.d/brotli.conf:

# Включите сжатие Brotli
brotli on;
brotli_comp_level 6;
brotli_static on;

brotli_types
    text/plain
    text/css
    text/javascript
    text/xml
    application/javascript
    application/json
    application/xml
    application/xml+rss
    application/xhtml+xml
    application/atom+xml
    application/rss+xml
    application/x-javascript
    application/x-font-ttf
    application/x-font-opentype
    application/vnd.ms-fontobject
    font/ttf
    font/otf
    font/opentype
    font/woff
    font/woff2
    image/svg+xml
    image/x-icon;

Перезагрузите NGINX:

nginx -t && systemctl reload nginx

Шаг 3: Убедитесь, что это работает

# Запрос с поддержкой Brotli
curl -sI -H 'Accept-Encoding: br' https://example.com | grep -i encoding
# Content-Encoding: br

# Сравните размеры
curl -so /dev/null -w '%{size_download}' -H 'Accept-Encoding: gzip' https://example.com
# 45678
curl -so /dev/null -w '%{size_download}' -H 'Accept-Encoding: br' https://example.com
# 38912  (меньше!)

Уровни сжатия

Уровень Скорость Сжатие Случай использования
1-3 Быстро Ниже Высокий трафик, ограниченные ресурсы ЦП
4-6 Сбалансировано Хорошо Большинство веб-сайтов (рекомендуется)
7-9 Медленнее Лучше Предварительно сжатые статические ресурсы
10-11 Очень медленно Лучшее Только для сжатия во время сборки

Рекомендация

Используйте уровень 4-6 для динамического контента и уровень 11 для предварительно сжатых статических ресурсов.


Предварительно сжать статические ресурсы

Для максимальной производительности предварительно сжимайте файлы во время сборки:

# Установите инструмент командной строки Brotli
dnf -y install brotli

# Сожмите ваши статические файлы
find /var/www/html -type f \( -name "*.css" -o -name "*.js" -o -name "*.html" -o -name "*.svg" \) \
    -exec brotli -kf --best {} \;

Это создаст файлы .br рядом с оригиналами. NGINX автоматически обслуживает их с brotli_static on.


Сравнение размеров

Пример из реальной жизни (jQuery 3.6.0 в минифицированном виде):

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#009639', 'primaryTextColor': '#fff'}}}%%
pie showData
    title Сравнение размеров файлов
    "Оригинал (89KB)" : 89
    "Gzip (31KB)" : 31
    "Brotli (27KB)" : 27
Формат Размер Экономия
Оригинал 89 KB
Gzip 31 KB 65%
Brotli 27 KB 70%

Расширенная конфигурация

Оставьте Gzip как резервный вариант

# Brotli (приоритет)
brotli on;
brotli_comp_level 6;

# Gzip (резервный вариант)
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/javascript application/json;

Разные уровни для динамического и статического контента

# Динамический контент - быстрее сжатие
brotli on;
brotli_comp_level 4;

# Предварительно сжатые статические файлы - лучшее сжатие
brotli_static on;

Минимальный порог размера

# Не сжимать маленькие файлы (не имеет смысла)
brotli_min_length 256;

Устранение неполадок

Brotli не работает
  1. Проверьте, что модуль загружен:

    nginx -V 2>&1 | grep brotli
    

  2. Убедитесь, что запрос включает Accept-Encoding: br

  3. Проверьте, что Content-Type в brotli_types

Слишком высокая загрузка ЦП

Понизьте уровень сжатия:

brotli_comp_level 4;  # или даже 2-3

Файлы не сжимаются
  • Проверьте, что размер файла > brotli_min_length
  • Убедитесь, что Content-Type соответствует brotli_types
  • Проверьте, что соединение уже не сжато (CDN)

Связанные