MAATRIX / Блог / Сжатие gzip и brotli в nginx для скорости сайта

Сжатие gzip и brotli в nginx для скорости сайта

Сжатие gzip и brotli в nginx: ускоряем сайт
Блог MAATRIX · 2026-07-07

HTML, CSS и JS отлично жмутся — сжатие режет вес страницы в разы и ускоряет загрузку без единой правки кода. Разбираем, как включить gzip и добавить более эффективный brotli в nginx, где взять модуль и как всё проверить.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему сжатие обязательно

Текстовые ресурсы — HTML, CSS, JavaScript, JSON, SVG — состоят из повторяющихся символов и прекрасно сжимаются. gzip уменьшает их вес на 60–80%, brotli — ещё на 10–20% лучше. Браузер получает сжатый ответ, распаковывает его на лету, а пользователь видит страницу быстрее, особенно на мобильном интернете.

  • Меньше трафика — экономия канала и денег.
  • Быстрее загрузка — прямое влияние на Core Web Vitals и SEO.
  • Бесплатно — работает на любом железе, только чуть нагружает CPU на сжатие.

gzip встроен в nginx из коробки, brotli требует отдельного модуля — но во многих сборках он уже есть. Начнём с gzip.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для быстрого сайта

Включаем gzip

Настройки gzip задаются в контексте http, чтобы работать для всех сайтов сразу. Минимальный, но полный конфиг выглядит так.

http {
    gzip on;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;
    gzip_types
        text/plain text/css text/xml
        application/json application/javascript
        application/xml+rss image/svg+xml;
}

Разберём ключевое: gzip_comp_level 5 — баланс между степенью сжатия и нагрузкой на CPU (диапазон 1–9, выше 6 почти не даёт выигрыша, но ест процессор). gzip_min_length 256 — не жать крошечные ответы, где накладные расходы больше выгоды. gzip_vary on добавляет заголовок Vary, чтобы прокси кэшировали сжатую и несжатую версии раздельно.

Обрати внимание: text/html в gzip_types указывать не нужно — он сжимается всегда по умолчанию.

Добавляем brotli

brotli эффективнее gzip, особенно для статики. В nginx он подключается модулем ngx_brotli. В Ubuntu/Debian часто доступен готовый пакет.

sudo apt update && sudo apt -y install libnginx-mod-http-brotli

После установки модуль подхватывается автоматически. Настройки brotli аналогичны gzip и живут в том же контексте http.

brotli on;
brotli_comp_level 6;
brotli_min_length 256;
brotli_types
    text/plain text/css text/xml
    application/json application/javascript
    application/xml+rss image/svg+xml;

nginx сам выберет метод: если браузер прислал Accept-Encoding: br — отдаст brotli, иначе gzip. Держать оба стоит: brotli для современных клиентов, gzip как фолбэк.

Статическое сжатие для максимума

Для неизменной статики (собранные CSS/JS) выгодно сжать файлы заранее и хранить .gz или .br рядом — тогда nginx отдаёт готовый файл без сжатия на каждый запрос. Включается это директивами _static.

gzip_static on;
brotli_static on;

Предварительно сжать файлы можно на этапе сборки или руками.

find /var/www/app/dist -type f \
  \( -name '*.js' -o -name '*.css' \) \
  -exec gzip -k -9 {} \;
# для brotli: brotli -k -q 11 file.js

Максимальный уровень (gzip -9, brotli -q 11) здесь оправдан: файл жмётся один раз при сборке, а отдаётся многократно уже готовым.

Проверяем результат

После правки — обязательная проверка синтаксиса и перезагрузка.

sudo nginx -t && sudo systemctl reload nginx

Убедиться, что сжатие работает, проще всего через curl с нужным заголовком. Ищем в ответе Content-Encoding.

curl -sI -H 'Accept-Encoding: br,gzip' https://example.com/style.css | grep -i content-encoding

Ответ content-encoding: br или gzip подтверждает, что всё включено. Сравнить вес до и после удобно так.

curl -s https://example.com/app.js | wc -c
curl -s -H 'Accept-Encoding: gzip' https://example.com/app.js | wc -c

Частые ошибки

  • Сжатие уже сжатого — не добавляй в types картинки JPEG/PNG и архивы: они уже сжаты, повторная компрессия только грузит CPU.
  • Слишком высокий comp_level — уровень 9 на динамике съедает процессор без заметного выигрыша; для живого HTML держи 4–6.
  • Забыли gzip_vary — без него прокси может отдать сжатый контент клиенту, который его не понимает.
  • brotli не установлен — если директивы brotli вызывают ошибку unknown directive, модуль не подключён; поставь пакет или собери nginx с ним.

Сжатие тратит CPU на каждый ответ, поэтому производительное ядро окупается напрямую: на AMD EPYC у MAATRIX компрессия почти не заметна в нагрузке даже при высоком comp_level.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для быстрого сайта

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

brotli всегда лучше gzip?

По степени сжатия — да, особенно для статики на максимальном уровне. Но gzip нужен как фолбэк для старых клиентов, поэтому держат оба одновременно.

Сжатие замедлит сервер?

Динамическое сжатие тратит немного CPU на каждый ответ, но выигрыш в скорости загрузки для пользователя перевешивает. Статическое сжатие нагрузки почти не создаёт.

Нужно ли жать за Cloudflare?

Cloudflare умеет жать сам, но включённое сжатие на origin уменьшает трафик между сервером и CDN, так что оставить его на nginx полезно.