HTTP сжатие
HTTP-сжатие — это технология, позволяющая уменьшить объём данных, передаваемых между веб-сервером и клиентом (обычно браузером), путём применения алгоритмов сжатия к телу HTTP-ответа (реже — запроса). Цель сжатия — сократить время загрузки веб-страниц и снизить нагрузку на сеть за счёт уменьшения размера передаваемых файлов (HTML, CSS, JavaScript, JSON, XML и других текстовых форматов).
Принцип работы
HTTP-сжатие основано на механизме согласования контента (content negotiation), описанном в спецификации HTTP/1.1 (RFC 7231). Клиент (браузер, мобильное приложение, API-клиент) при отправке запроса указывает в заголовке Accept-Encoding список поддерживаемых алгоритмов сжатия (например, gzip, deflate, br). Сервер, получив запрос, выбирает один из поддерживаемых алгоритмов (обычно наиболее эффективный из заявленных) и, если это возможно, сжимает тело ответа. В ответе сервер добавляет заголовок Content-Encoding, указывающий применённый алгоритм (например, Content-Encoding: gzip). Клиент, получив ответ, распаковывает данные с помощью указанного алгоритма.
Сжатие не применяется к изображениям, видео, аудио и другим уже сжатым форматам (например, JPEG, PNG, MP4), так как повторное сжатие не даёт значительного выигрыша или может увеличить размер.
Алгоритмы сжатия
gzip
Наиболее распространённый и универсальный алгоритм. Основан на библиотеке zlib (алгоритм DEFLATE). Поддерживается всеми современными браузерами и веб-серверами. Обеспечивает хорошую степень сжатия (обычно 60–80 % для текстовых файлов) при умеренных затратах процессорного времени. Включён в стандарт HTTP/1.1.
deflate
Алгоритм, использующий тот же метод DEFLATE, но с другой обёрткой (zlib). Исторически поддерживается, но на практике уступает gzip по распространённости из-за проблем с реализацией в некоторых старых браузерах. В современных системах практически не используется.
Brotli (br)
Современный алгоритм сжатия, разработанный компанией Google. Впервые представлен в 2015 году, стандартизирован в RFC 7932. Обеспечивает более высокую степень сжатия, чем gzip (на 15–25 %), особенно для текстовых файлов и веб-шрифтов. Требует больше процессорного времени для сжатия, но распаковка происходит быстро. Поддерживается всеми современными браузерами (Google Chrome, Mozilla Firefox, Safari, Microsoft Edge). Для использования Brotli сервер должен поддерживать его (например, модули для Nginx, Apache, IIS).
Другие алгоритмы
- compress — устаревший алгоритм (LZW), не поддерживается современными браузерами.
- zstd (Zstandard) — перспективный алгоритм, предложенный Facebook (организация Meta признана экстремистской и запрещена в РФ), обеспечивающий высокую скорость и степень сжатия. Включён в черновик HTTP/3, но пока не получил широкого распространения в веб-серверах.
Настройка на стороне сервера
Веб-серверы
- Nginx: сжатие включается директивой
gzip on;. Для Brotli требуется установка модуляngx_brotli. Настройка осуществляется в файле конфигурации (nginx.conf). - Apache: сжатие включается модулем
mod_deflate(для gzip) илиmod_brotli(для Brotli). Настройка производится в файле.htaccessили в конфигурации виртуального хоста. - IIS: сжатие включается через компонент «Сжатие HTTP» (Dynamic Content Compression и Static Content Compression). Настройка осуществляется через диспетчер IIS или конфигурационные файлы.
Параметры настройки
- Уровень сжатия (от 1 до 9, где 9 — максимальное сжатие, но большее потребление CPU).
- Минимальный размер файла для сжатия (например, 1 КБ).
- MIME-типы, подлежащие сжатию (обычно
text/html,text/css,application/javascript,application/json,image/svg+xml). - Исключения для определённых путей или типов файлов.
Влияние на производительность
Положительные эффекты
- Уменьшение объёма передаваемых данных (в среднем в 3–5 раз для текстовых файлов), что сокращает время загрузки страницы, особенно на медленных соединениях.
- Снижение нагрузки на сеть и сервер за счёт уменьшения трафика.
- Улучшение показателей SEO (скорость загрузки — один из факторов ранжирования).
Отрицательные эффекты
- Дополнительная нагрузка на процессор сервера при сжатии (особенно при высоком уровне сжатия и большом количестве запросов).
- Задержка на стороне клиента при распаковке (минимальна, так как распаковка выполняется быстрее сжатия).
- Неэффективность для уже сжатых данных (изображения, видео).
Сжатие в HTTP/2 и HTTP/3
В HTTP/2 и HTTP/3 сжатие тела ответа работает аналогично HTTP/1.1. Однако в HTTP/2 дополнительно применяется сжатие заголовков с помощью алгоритма HPACK (для HTTP/2) и QPACK (для HTTP/3). Сжатие заголовков не относится к HTTP-сжатию в узком смысле, но является частью протокола.
Ограничения и безопасность
- Атаки на сжатие (например, BREACH, CRIME) — злоумышленники могут использовать утечку информации через сжатие, если в теле ответа присутствуют секретные данные (например, CSRF-токены). Для защиты рекомендуется отключать сжатие для ответов, содержащих конфиденциальные данные, или использовать дополнительные меры (например, рандомизацию).
- Несовместимость — некоторые старые прокси-серверы или антивирусные программы могут неправильно обрабатывать сжатые ответы (например, удалять заголовок
Content-Encoding). Для решения этой проблемы используется заголовокVary: Accept-Encoding, который указывает кеширующим серверам, что ответ зависит от заголовка запроса.
Практические рекомендации
- Включать сжатие для всех текстовых ресурсов (HTML, CSS, JavaScript, JSON, XML, SVG, шрифты).
- Использовать Brotli, если сервер и клиент его поддерживают (в современных браузерах — да).
- Устанавливать уровень сжатия 4–6 для динамического контента (баланс между степенью сжатия и нагрузкой на CPU) и 9 для статического контента (сжатие выполняется один раз при сборке).
- Отключать сжатие для файлов размером менее 1–2 КБ (сжатие может увеличить размер).
- Проверять корректность работы сжатия с помощью онлайн-инструментов (например,
checkgzipcompression.com) или через инструменты разработчика браузера (вкладка Network, столбец Content-Encoding).
Источники
- RFC 7230 — HTTP/1.1: Message Syntax and Routing
- RFC 7231 — HTTP/1.1: Semantics and Content
- RFC 7932 — Brotli Compressed Data Format
- Документация Nginx: модуль ngx_http_gzip_module
- Документация Apache: модуль mod_deflate
- Статья «HTTP Compression» на сайте MDN Web Docs
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →