Настройка сжатия Gzip в Nginx и Apache: полное руководство для DevOps | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Настройка сжатия Gzip в Nginx и Apache: полное руководство для DevOps

04 апреля 2026 8 мин. чтения

Настройка сжатия Gzip на веб-сервере — это одна из самых быстрых и эффективных оптимизаций, которую вы можете сделать для любого продакшн-сайта. Она позволяет сэкономить до 70–90% трафика на передаче текстовых ресурсов (HTML, CSS, JS) и пропорционально ускорить их загрузку для конечных пользователей. В этом руководстве вы получите готовые, проверенные на практике конфигурации для Nginx и Apache, точный список типов файлов для сжатия и пошаговые инструкции по проверке и отладке.

Зачем настраивать Gzip: выгода для скорости и трафика

Сжатие Gzip (или его более современный аналог Brotli) — это базовая, обязательная настройка для любого веб-сервера, работающего в режиме реального времени. Ее влияние напрямую отражается на ключевых метриках производительности Google Core Web Vitals, таких как Largest Contentful Paint (LCP) и First Contentful Paint (FCP). Уменьшая размер передаваемых данных в 3–10 раз, вы не только снижаете нагрузку на сетевой канал, но и сокращаете время, необходимое браузеру для загрузки и парсинга критически важных ресурсов.

В отличие от оптимизации изображений или настройки кеширования, внедрение Gzip требует минимальных усилий и не несет рисков для функциональности сайта. Это «низко висящий плод» в оптимизации производительности. Хотя Brotli предлагает лучшее сжатие для современных браузеров, Gzip остается стандартом де-факто из-за своей универсальной поддержки и служит надежным fallback-решением. Начинать всегда стоит с него.

Что сжимать, а что нет: оптимальный список MIME-типов

Ключевой принцип эффективной настройки — сжимать только те файлы, которые хорошо поддаются компрессии, и избегать бесполезной нагрузки на CPU попытками сжать уже сжатые данные.

Обязательно сжимать следующие MIME-типы:

  • text/html
  • text/css
  • text/javascript, application/javascript
  • application/json
  • application/xml, text/xml
  • image/svg+xml (SVG-изображения по сути являются текстовыми XML-документами)

Эти форматы, будучи текстовыми, сжимаются исключительно эффективно.

Не сжимать (или исключить из сжатия):

  • Изображения: image/jpeg, image/png, image/webp, image/avif
  • Архивы: application/zip, application/gzip, application/x-rar-compressed
  • Видео и аудио: video/*, audio/*
  • Шрифты: font/woff2, font/woff (обычно уже сжаты)
  • Документы: application/pdf

Сжатие этих бинарных форматов даст мизерный выигрыш в размере (1-2%) при значительной нагрузке на процессор сервера.

Особые случаи: шрифты, XML и API-ответы

С форматами шрифтов (WOFF/WOFF2) следует быть осторожным: они изначально спроектированы как сжатые. Перед включением их в список сжатия проверьте заголовки ответа от вашего сервера — если файл уже отдает Content-Encoding, повторное сжатие излишне.

SVG-файлы, имеющие MIME-тип image/svg+xml или text/xml, отлично сжимаются. То же самое относится к XML-файлам, например, картам сайта (sitemap.xml), размер которых можно уменьшить в разы.

JSON-ответы API — критически важный кандидат для сжатия, особенно для мобильных клиентов, где каждый килобайт трафика и миллисекунда задержки на счету. Всегда включайте application/json в список сжимаемых типов.

Готовая конфигурация Gzip для Nginx

Ниже приведен готовый блок конфигурации для включения сжатия Gzip в Nginx. Его следует разместить в контексте http {} в основном файле конфигурации (например, nginx.conf) или в отдельном include-файле, чтобы настройки применялись глобально ко всем виртуальным хостам.

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json image/svg+xml;

Построчный разбор:

  • gzip on; — включает обработку gzip.
  • gzip_vary on; — добавляет в ответ заголовок Vary: Accept-Encoding. Это критически важно для корректной работы прокси-кешей (CDN, облачные балансировщики), чтобы они различали сжатые и несжатые версии контента.
  • gzip_proxied any; — сжимает ответы даже для проксируемых запросов (например, от бэкенда).
  • gzip_comp_level 6; — уровень сжатия от 1 (минимальный) до 9 (максимальный). Уровень 6 — оптимальный баланс между степенью сжатия и нагрузкой на CPU.
  • gzip_min_length 1024; — не сжимать файлы меньше 1 КБ. Сжатие очень маленьких файлов может привести к увеличению их размера из-за накладных расходов на заголовки.
  • gzip_buffers 16 8k; — выделяет 16 буферов по 8 КБ каждый для потокового сжатия.
  • gzip_http_version 1.1; — сжимать ответы только для HTTP/1.1 и выше.
  • gzip_types ... — список MIME-типов для сжатия, соответствующий рекомендациям выше.

Важное предупреждение: Убедитесь, что модуль ngx_http_gzip_module скомпилирован в вашей версии Nginx (он включен по умолчанию в большинстве сборок). Не дублируйте эти директивы в конфигурациях server или location, если они уже заданы на уровне http.

Продвинутые настройки: уровень сжатия, буферы и gzip_static

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

  • Уровень сжатия (gzip_comp_level): Для высоконагруженных серверов, где CPU в дефиците, можно снизить уровень до 2-4. Для CDN или серверов, где критичен трафик, можно повысить до 8-9, помня об экспоненциальном росте нагрузки на процессор.
  • Директива gzip_static on;: Это мощная оптимизация. При ее включении Nginx будет искать предварительно сжатые файлы с расширением .gz (например, style.css.gz) рядом с оригинальными и отдавать их сразу, без динамического сжатия. Это полностью снимает нагрузку на CPU. Чтобы использовать эту опцию, необходимо сжать статические файлы заранее, например, командой gzip -k -9 style.css.

Для комплексной оптимизации производительности, включая анализ нагрузки на CPU и память, обратитесь к нашему практическому руководству по мониторингу сервера.

Готовая конфигурация Gzip для Apache (mod_deflate)

В Apache сжатие реализуется модулем mod_deflate. Сначала убедитесь, что он загружен: sudo a2enmod deflate && sudo systemctl reload apache2 (для Debian/Ubuntu).

Вариант 1: Настройка в виртуальном хосте или .htaccess

Поместите следующий код в конфигурацию виртуального хоста (<VirtualHost>) или в файл .htaccess в корне сайта.


    # Включает сжатие для указанных типов контента
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml image/svg+xml

    # Исключает уже сжатые форматы
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|zip|gz|rar|bz2|pdf|woff2?)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI \.(?:mp4|mov|avi|mp3|ogg)$ no-gzip dont-vary

    # Добавляет заголовок Vary для прокси-кешей
    Header append Vary User-Agent env=!dont-vary

Вариант 2: Более гибкая настройка с использованием mod_filter

Для Apache 2.4+ и более сложных сценариев можно использовать директиву FilterChain.


    
        FilterDeclare   COMPRESS
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/javascript
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/javascript
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/json
        FilterChain     COMPRESS
        FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no
    

Настройка через .htaccess для популярных CMS

Для сайтов на WordPress, Joomla, 1C-Битрикс, где доступ к основному конфигу Apache ограничен, используйте первый вариант с размещением кода в .htaccess. Убедитесь, что в файле нет других правил, переопределяющих заголовки сжатия. После добавления правил очистите кеш CMS и проверьте работу.

Как проверить, что Gzip работает корректно

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

1. Через браузер (Chrome DevTools):

  • Откройте инструменты разработчика (F12).
  • Перейдите на вкладку Network.
  • Обновите страницу (F5).
  • Кликните на любой запрос текстового ресурса (HTML, CSS, JS).
  • Во вкладке Headers найдите строку Response Headers.
  • Должна присутствовать строка: Content-Encoding: gzip (или br для Brotli).

2. Через командную строку с помощью curl:

curl -H "Accept-Encoding: gzip" -I https://ваш-сайт.ru/style.css

В ответе ищите:
HTTP/1.1 200 OK
Content-Type: text/css
Content-Encoding: gzip <-- Ключевой признак успеха.

3. С помощью онлайн-инструментов:

Существуют различные онлайн-сервисы для проверки сжатия. Их использование просто: введите URL вашего сайта и проверьте отчет.

Если вы столкнулись с падением производительности после внесения изменений, диагностировать причину помогут методы из нашего руководства по диагностики веб-приложений.

Типичные ошибки конфигурации и их решение

  1. Дублирование директив: Если директива gzip on; прописана и в http {}, и в server {} в Nginx, это может привести к неожиданному поведению. Оставляйте настройку только в основном контексте http.
  2. Отсутствие gzip_vary on; (Nginx) или заголовка Vary (Apache): Без этого прокси-серверы (включая CDN) могут отдавать несжатый контент браузерам, которые поддерживают сжатие, и наоборот, что ломает кеширование.
  3. Сжатие уже сжатых бинарных файлов: Самая распространенная ошибка — включение в gzip_types или AddOutputFilterByType форматов вроде image/jpeg. Это бесполезно тратит ресурсы CPU. Строго следуйте спискам, приведенным выше.
  4. Модуль mod_deflate не загружен в Apache: Проверьте командой apache2ctl -M | grep deflate (или httpd -M).
  5. Некорректный MIME-type: Если ваш сервер отдает CSS-файлы с типом application/octet-stream, правила, основанные на Content-Type, не сработают. Исправьте настройки MIME-типов на веб-сервере.

Обеспечение обратной совместимости со старыми браузерами

Подавляющее большинство современных браузеров поддерживают Gzip. Для редких исключений (например, очень старые версии IE) важно, чтобы сайт оставался функциональным. В Nginx за это частично отвечает директива gzip_disable, например, gzip_disable "msie6";. Однако сегодня более правильный подход — условная подача контента.

Версия протокола HTTP и заголовок Accept-Encoding, которые отправляет браузер, являются основными критериями. И Nginx, и Apache (с mod_filter) автоматически отдают сжатый контент только тем клиентам, которые заявили о его поддержке. Если браузер не отправляет Accept-Encoding: gzip, он получит исходный, несжатый файл. Таким образом, обратная совместимость обеспечивается на уровне протокола без дополнительных сложных настроек.

Интеграция с веб-приложениями и фреймворками

Хотя настройка на уровне веб-сервера (Nginx/Apache) является наиболее эффективной, многие фреймворки предоставляют встроенные middleware для сжатия ответов. Это полезно на этапе разработки или в архитектурах, где веб-сервер недоступен для конфигурации (например, некоторые PaaS-решения).

  • Node.js (Express): Middleware compression.
  • Python (Django): Middleware django.middleware.gzip.GZipMiddleware (осторожно, может конфликтовать с кешированием).
  • PHP (Laravel, Symfony): Сжатие обычно настраивается на уровне веб-сервера. Встроенные решения есть, но менее эффективны.

Ключевая рекомендация: Всегда отдавайте приоритет настройке сжатия на уровне обратного прокси (Nginx/Apache) перед вашим приложением. Это разгрузит workers/processes приложения и позволит использовать более продвинутые функции, такие как gzip_static и кеширование сжатых ответов. Для оценки производительности вашего стека после оптимизаций используйте методы из руководства по нагрузочному тестированию.

Поделиться:
Сохранить гайд? В закладки браузера