Настройка сжатия контента Brotli и Gzip в Nginx: ускорение веб-сервера
- Медленная загрузка текстовых ресурсов (JS, CSS, HTML, SVG, JSON) у клиентов с мобильным интернетом.
- Высокий исходящий трафик и перегрузка сетевого интерфейса веб-сервера.
- Браузер поддерживает заголовок
Accept-Encoding: gzip, deflate, br, но получает несжатые ответы (Content-Encoding отсутствует).
1. Настройка стандартного модуля Gzip в /etc/nginx/nginx.conf
В блоке http включите компрессию:
gzip on;
gzip_disable "msie6";
# Оптимальный уровень сжатия (баланс между размером и CPU)
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
# MIME-типы для компрессии (никогда не сжимайте картинки и видео)
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
application/xml+rss
image/svg+xml;2. Настройка Brotli (требует ngx_brotli)
Сжатие Brotli обеспечивает на 15-25% большую плотность сжатия по сравнению с Gzip:
brotli on;
brotli_comp_level 4; # 4-5 для динамики, 11 для статики
brotli_min_length 256;
brotli_types
text/plain
text/css
text/javascript
application/javascript
application/json
image/svg+xml;3. Проверка работы сжатия через curl
# Тест Gzip
curl -H "Accept-Encoding: gzip" -I https://example.com/main.css | grep -i content-encoding
# Тест Brotli
curl -H "Accept-Encoding: br" -I https://example.com/main.css | grep -i content-encoding4. Валидация и перезагрузка
nginx -t && systemctl reload nginx Частые вопросы (FAQ)
Почему не стоит ставить gzip_comp_level 9 для динамических запросов?
Степень сжатия между 5 и 9 уровнем дает выигрыш в размере менее 2-3%, но увеличивает нагрузку на процессор (CPU usage) в 4-5 раз, что приводит к деградации RPS при высоких нагрузках.
Зачем нужна директива gzip_vary on?
Она добавляет заголовок 'Vary: Accept-Encoding' в ответ сервера, что сообщает промежуточным кэширующим прокси (CDN) о необходимости хранить две раздельные копии страницы: для клиентов с поддержкой сжатия и без нее.