Освоение сжатия в Nginx: Gzip против Brotli для веб-производительности
Освойте сжатие контента в Nginx, сравнив алгоритмы Gzip и Brotli. Изучите практические директивы конфигурации для включения обоих, поймите компромиссы в производительности и откройте для себя лучшие практики, такие как использование статических файлов Brotli для значительного снижения использования пропускной способности и ускорения доставки контента на ваших веб-серверах.
Освоение сжатия в Nginx: Gzip против Brotli для веб-производительности
Сжатие в Nginx — это одно из тех изменений, которые кажутся незначительными, пока вы не заглянете на вкладку "Сеть". CSS-файл, JavaScript-бандл, HTML-страница, JSON-ответ API или SVG-изображение могут передаваться по сети в виде гораздо меньшего ответа, а затем разворачиваться обратно в то же содержимое в браузере.
Практический выбор обычно не сводится к "Gzip или Brotli навсегда". В большинстве production-сред используются оба: Brotli для браузеров, которые его запрашивают, Gzip как запасной вариант, и предварительно сжатые статические файлы, которые можно создать на этапе сборки. Однако детали имеют значение. Скопированный блок сжатия может тратить ресурсы CPU, пропускать важные MIME-типы или молча не работать, потому что модуль Brotli на самом деле не установлен.
Понимание веб-сжатия в Nginx
Сжатие работает путем поиска повторяющихся шаблонов в данных (например, HTML, CSS или JavaScript файлах) и замены их более короткими ссылками. Это уменьшает общий размер файла, передаваемого по сети. Nginx выступает в роли посредника, динамически применяя выбранный алгоритм сжатия перед отправкой данных в браузер.
Nginx обычно требует модуль ngx_http_gzip_module для Gzip и отдельный модуль Brotli для Brotli. Большинство распространенных пакетов Nginx включают поддержку Gzip. Brotli более вариативен: некоторые дистрибутивы упаковывают его как динамический модуль, некоторые сторонние репозитории включают его, а некоторые сборки вообще его не имеют.
Предварительные требования
Убедитесь, что ваша установка Nginx поддерживает Brotli, если вы планируете его использовать. Вы часто можете проверить, доступен ли Brotli, выполнив:
nginx -V 2>&1 | grep -i brotli
Если вывод упоминает Brotli, подтвердите, скомпилирован ли он или загружен как динамический модуль. В системах на Debian или Ubuntu также проверьте файлы в /etc/nginx/modules-enabled/, если ваш пакет использует динамические модули:
ls -l /etc/nginx/modules-enabled/ | grep -i brotli
Если Nginx отклоняет brotli on; во время nginx -t, модуль недоступен для этого запущенного бинарника Nginx, даже если в операционной системе установлен пакет Brotli где-то еще.
1. Настройка сжатия Gzip
Gzip — это зрелый, широко поддерживаемый стандарт сжатия контента. Он предлагает хороший баланс между степенью сжатия и нагрузкой на CPU.
Включение Gzip в конфигурации Nginx
Настройки Gzip обычно размещаются в блоках http, server или location вашего конфигурационного файла Nginx (nginx.conf или включенных файлов конфигурации).
Чтобы включить сжатие Gzip, используйте следующие директивы:
http {
# Включить сжатие Gzip
gzip on;
# Установить минимальный размер ответа для сжатия (байты)
# Сжимать только файлы размером более 1000 байт
gzip_min_length 1000;
# Уровень сжатия (1=самый быстрый/наименьшее сжатие, 9=самый медленный/наибольшее сжатие)
gzip_comp_level 6;
# Указать, какие MIME-типы сжимать
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# Рекомендуется: отправлять заголовок Vary: Accept-Encoding, чтобы прокси кэшировали как сжатые, так и несжатые версии
gzip_vary on;
# Рекомендуется: добавить заголовок gzip для идентификации
gzip_proxied any;
}
Объяснение ключевых директив Gzip
gzip on;: Активирует модуль Gzip.gzip_comp_level: Установка значения от 4 до 6 часто является оптимальной точкой для производительности. Более высокие уровни экономят больше пропускной способности, но увеличивают нагрузку на CPU сервера.gzip_types: Крайне важно никогда не сжимать уже сжатые форматы, такие как изображения (.jpg,.png,.gif) или видео.
2. Настройка сжатия Brotli
Brotli — это более новый алгоритм сжатия, разработанный Google. Для текстовых ресурсов он часто создает файлы меньшего размера, чем Gzip. Точный выигрыш зависит от контента, уровня сжатия и того, сжимаются ли файлы во время каждого запроса или заранее во время развертывания.
Включение Brotli в конфигурации Nginx
Конфигурация Brotli использует похожие директивы, но заменяет gzip на brotli.
brotli on;
brotli_comp_level 6; # Обычно рекомендуется от 4 до 8
brotli_static on; # Включает обслуживание предварительно сжатых .br файлов, если они доступны
brotli_types text/plain text/css application/json application/javascript application/x-javascript text/xml;
Важное замечание о предварительном сжатии (brotli_static):
Сжатие Brotli может быть ресурсоемким для CPU при выполнении на лету для каждого запроса. Распространенной лучшей практикой является предварительное сжатие ресурсов с помощью специального офлайн-инструмента (например, утилиты командной строки brotli) и сохранение версии .br рядом с исходным файлом (например, style.css и style.css.br).
Установка brotli_static on; указывает Nginx проверять, существует ли предварительно сжатый файл .br для запрошенного ресурса, и обслуживать его напрямую, если клиент поддерживает Brotli, полностью минуя обработку в реальном времени.
3. Gzip против Brotli: правильный выбор
Выбор между Gzip и Brotli сильно зависит от поддержки клиентов и ресурсов вашего сервера.
| Особенность | Gzip | Brotli | Рекомендация |
|---|---|---|---|
| Степень сжатия | Хорошая | Часто лучше для текстовых ресурсов | Brotli обычно выигрывает |
| Нагрузка на CPU (на лету) | Низкая | От умеренной до высокой | Gzip легче |
| Поддержка клиентами | Почти повсеместная (все современные браузеры) | Очень высокая (большинство современных браузеров) | Gzip безопаснее для поддержки старых систем |
| Предварительное сжатие | Возможно, но менее распространено | Настоятельно рекомендуется (brotli_static) |
Используйте предварительно сжатый Brotli, если возможно |
Гибридный подход: лучшая практика
Самая надежная современная конфигурация использует гибридную настройку, отдавая приоритет Brotli для современных клиентов, обеспечивая при этом Gzip как надежный запасной вариант.
- Приоритет Brotli: Настройте Brotli в первую очередь, часто используя
brotli_static on;для скорости. - Запасной вариант Gzip: Убедитесь, что Gzip включен и настроен для обработки клиентов, которые не поддерживают Brotli.
Nginx выбирает ответ на основе заголовка Accept-Encoding клиента и модулей, включенных в вашу сборку. При обычном трафике браузера Brotli предпочтительнее, когда клиент указывает br; Gzip остается полезным для клиентов, инструментов, прокси и старых стеков, которые запрашивают только gzip.
Пример гибридной конфигурации
Если ваша версия Nginx поддерживает оба модуля, вы можете включить их одновременно. Nginx определяет приоритет того, какой модуль обслуживает контент, на основе заголовков запроса клиента.
http {
# --- Конфигурация Brotli ---
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
# --- Конфигурация Gzip (запасной вариант) ---
gzip on;
gzip_comp_level 5;
gzip_vary on;
gzip_proxied any;
gzip_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
}
Советы по настройке производительности
Независимо от того, какой алгоритм вы выберете, придерживайтесь следующих лучших практик для максимального эффекта:
1. Проверьте фактический ответ
Не предполагайте, что сжатие работает, потому что в файле конфигурации есть gzip on; или brotli on;. Проверьте реальный ответ:
curl -I -H 'Accept-Encoding: br,gzip' https://example.com/app.js
curl -I -H 'Accept-Encoding: gzip' https://example.com/app.js
Ищите Content-Encoding: br или Content-Encoding: gzip. Также сохраняйте Vary: Accept-Encoding для ответов, которые могут кэшироваться CDN или общим прокси, чтобы сжатые и несжатые варианты не смешивались.
2. Избегайте чрезмерного сжатия
Никогда не устанавливайте gzip_comp_level или brotli_comp_level слишком высокими (например, 9 или 11), если только ваш сервер не сильно недогружен. Предельный выигрыш в уменьшении размера файла редко оправдывает дополнительные циклы CPU, необходимые для вычислений.
3. Кэшируйте предварительно сжатые файлы
Для Brotli использование brotli_static on; и предварительное сжатие статических ресурсов — это самый большой выигрыш в производительности. Это переносит нагрузку на CPU со времени запроса на время развертывания.
4. Тестируйте вашу конфигурацию
После изменения конфигурации Nginx всегда проверяйте синтаксис перед перезагрузкой:
sudo nginx -t
В случае успеха перезагрузите Nginx для применения изменений:
sudo systemctl reload nginx
Вы также можете использовать инструменты разработчика браузера или сервисы тестирования производительности, чтобы убедиться, что ответы обслуживаются с Content-Encoding: gzip или Content-Encoding: br.
Практический способ внедрения
Начните с Gzip, если на сайте вообще нет сжатия. Он встроен в большинство пакетов Nginx и дает вам быструю базовую линию. Затем добавьте Brotli, как только подтвердите поддержку модуля и найдете способ генерировать файлы .br для статических ресурсов во время развертывания.
Для сайта на React, Vue или статического документационного сайта лучшей настройкой обычно являются предварительно сжатые файлы .br и .gz для собранных ресурсов, умеренное динамическое сжатие для HTML и API-ответов, а также конфигурация CDN, учитывающая Accept-Encoding. Для небольшого API, работающего вблизи лимитов CPU, консервативный уровень Gzip может быть лучшим первым шагом.
Выигрыш не только в меньших файлах. Хорошее сжатие снижает пропускную способность, помогает более медленным клиентским подключениям и устраняет ненужное время передачи без изменения кода приложения. Основная дисциплина — тестировать заголовки, избегать сжатия уже сжатых медиафайлов и поддерживать уровни сжатия достаточно скромными, чтобы ваш сервер мог дышать во время пиков трафика.