Сжатие gzip и brotli в nginx для скорости сайта
HTML, CSS и JS отлично жмутся — сжатие режет вес страницы в разы и ускоряет загрузку без единой правки кода. Разбираем, как включить gzip и добавить более эффективный brotli в nginx, где взять модуль и как всё проверить.
Содержание
Почему сжатие обязательно
['Текстовые ресурсы — HTML, CSS, JavaScript, JSON, SVG — состоят из повторяющихся символов и прекрасно сжимаются. gzip уменьшает их вес на 60–80%, brotli — ещё на 10–20% лучше. Браузер получает сжатый ответ, распаковывает его на лету, а пользователь видит страницу быстрее, особенно на мобильном интернете.', '- Меньше трафика — экономия канала и денег.
- Быстрее загрузка — прямое влияние на Core Web Vitals и SEO.
- Бесплатно — работает на любом железе, только чуть нагружает CPU на сжатие.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для быстрого сайтаВключаем gzip
['Настройки gzip задаются в контекстеhttp, чтобы работать для всех сайтов сразу. Минимальный, но полный конфиг выглядит так.', 'http {\n gzip on;\n gzip_comp_level 5;\n gzip_min_length 256;\n gzip_proxied any;\n gzip_vary on;\n gzip_types\n text/plain text/css text/xml\n application/json application/javascript\n application/xml+rss image/svg+xml;\n}', 'Разберём ключевое: 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;\nbrotli_comp_level 6;\nbrotli_min_length 256;\nbrotli_types\n text/plain text/css text/xml\n application/json application/javascript\n application/xml+rss image/svg+xml;', 'nginx сам выберет метод: если браузер прислал Accept-Encoding: br — отдаст brotli, иначе gzip. Держать оба стоит: brotli для современных клиентов, gzip как фолбэк.']
Статическое сжатие для максимума
['Для неизменной статики (собранные CSS/JS) выгодно сжать файлы заранее и хранить.gz или .br рядом — тогда nginx отдаёт готовый файл без сжатия на каждый запрос. Включается это директивами _static.', 'gzip_static on;\nbrotli_static on;', 'Предварительно сжать файлы можно на этапе сборки или руками.', "find /var/www/app/dist -type f \\\n \\( -name '*.js' -o -name '*.css' \\) \\\n -exec gzip -k -9 {} \\;\n# для 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\ncurl -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 с ним.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для быстрого сайтаЧастые вопросы
brotli всегда лучше gzip?
По степени сжатия — да, особенно для статики на максимальном уровне. Но gzip нужен как фолбэк для старых клиентов, поэтому держат оба одновременно.
Сжатие замедлит сервер?
Динамическое сжатие тратит немного CPU на каждый ответ, но выигрыш в скорости загрузки для пользователя перевешивает. Статическое сжатие нагрузки почти не создаёт.
Нужно ли жать за Cloudflare?
Cloudflare умеет жать сам, но включённое сжатие на origin уменьшает трафик между сервером и CDN, так что оставить его на nginx полезно.