Размер передаваемых данных является основным фактором, влияющим на «тяжесть» сайта, на его время загрузки. Все меры, обеспечивающее меньший объем передаваемых данных при сохранении объема информации или качества сайта, являются наиболее приоритетными при ускорении сайта. А методики, которые могут позволить такие меры применять, ценятся на вес золота. Сегодня мы разберемся, зачем нужно сжатие (или архивирование) данных на сайтах и как его правильно настроить.

На текущий момент существует большое количество алгоритмов сжатия (архивирования) данных, которые можно разделить на три основные группы:

1. Поточные алгоритмы. К этой группе относятся алгоритмы семейств RLE (run-length encoding), LZ* и др. При кодировании данных используется не информация о частотах символов в сообщении, а информация о последовательностях, встречавшихся ранее. Так работает, например, gzip (LZ77), bzip и compress.

2. Алгоритмы статистического (энтропийного) сжатия. Эта группа алгоритмов сжимает информацию, используя частоты, с которыми различные символы встречаются в сообщении. К алгоритмам этой группы относятся алгоритмы арифметического и префиксного кодирования (с использованием деревьев Шеннона-Фанно, Хаффмана, секущих). Алгоритм сжатия данных brotli использует, в том числе, кодирование Хаффмана совместно с LZ-алгоритмами.

3. Разностные алгоритмы. В отдельную группу можно выделить алгоритмы преобразования информации (включая использование словарей). Алгоритмы этой группы часто не производят непосредственного сжатия информации, но их применение значительно упрощает дальнейшее сжатие с использованием поточных и энтропийных алгоритмов. Алгоритм SDCH (VCDIFF) использует именно словари и разностное кодирование информации.

Поточные алгоритмы

Кодирование длин серий (RLE — Run-Length Encoding) — это один из самых простых и распространённых алгоритмов сжатия данных. В этом алгоритме последовательность повторяющихся символов заменяется символом и количеством его повторов.

Например, строку «ААААА», требующую для хранения 5 байт (при условии, что на хранение одного символа отводится байт), можно заменить на «5А», состоящую из двух байт. Очевидно, что этот алгоритм тем эффективнее, чем длиннее серия повторов и чем больше таких повторов в исходном (кодируемом) тексте.

Основным недостатком этого алгоритма является его крайне низкая эффективность на последовательностях неповторяющихся символов. Например, если рассмотреть последовательность «АБАБАБ» (6 байт), то после применения алгоритма RLE она превратится в «1А1Б1А1Б1А1Б» (12 байт). Для решения проблемы неповторяющихся символов существуют различные методы.

Алгоритмы LZ (название происходит от авторов Абрахама Лемпэла (Abraham Lempel) и Якоба Зива (Jacob Ziv)), в отличие от алгоритмов RLE, кодирует не количество повторов символов, а встречавшиеся ранее последовательности символов. Во время работы рассматриваемых алгоритмов динамически создаётся таблица со списком уже встречавшихся последовательностей и соответствующих им кодов. Эту таблицу часто называют словарём, а соответствующую группу алгоритмов называют поточно-словарными. К плюсам этой группы относится их большая, по сравнению, с RLE эффективность сжатия.

Наиболее известной реализацией этих алгоритмов является gzip-сжатие данных. Ранее различали два варианта использования в Сети: gzip и deflate. Единственное отличие между ними заключается в отправке (gzip) или не отправке (deflate) начала потока данных (файла), в котором описано, что это gzip-сжатые данные. Для упрощения работы gzip-сжатия (включая использование статического сжатия) от поддержки deflate сейчас почти везде отказались.

Как настроить gzip на сайте

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

Но с ростом процессорных издержек фактическая эффективность gzip-сжатия растет по-другому. Ниже на графике хорошо видно, что только до 5 степени сжатия эффективность растет линейно (пропорционально), а после это существенно замедляет свой рост. Если процессорные ресурсы у вас в избытке, то можно выставить и 7, и 9 степень сжатия, но изменений между 7 и 9 степенью почти нет (это доли процента).

Для nginx gzip-сжатие включается простыми директивами:

gzip on;
gzip_comp_level 7;
gzip_vary on;
gzip_types text/css text/javascript application/javascript;

Директива gzip_vary позволит передать соответствующий заголовок для кэширующих прокси с указанием особенностей кэширования сжатых ресурсов. А gzip_types укажет, для каких типов файлов необходимо применять сжатие на сервере.

Статическое сжатие nginx

Для экономии ресурсов процессора вы можете использовать заранее сжатые файлы в формате gzip, имеющие дополнительное расширение .gz (например: main.css.gz будет архивом файла main.css). При сжатии таких файлов можно использовать максимальную степень сжатия: они будут сжиматься только 1 раз, в дальнейшем веб-сервер будет использовать уже сжатую версию вместо обычной для тех пользователей, которые поддерживают сжатие.

Для подключения статического сжатия в nginx нужна поддержка модуля gzip_static, соответствующая директива в конфигурации выглядят так:
gzip_static on;

Сжатие в Apache

Apache использует модуль mod_deflate для отгрузки сжатых версий файлов. Его можно включить следующим образом (если он присутствует на сервере):

<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript
DeflateCompressionLevel 7
</ifmodule>

Сжатие в IIS

Для включения сжатия в веб-сервере IIS необходимо в диспетчере служб IIS зайти в свойства элемента «Веб узлы» и перейти на вкладку «Службы». Также сжатие можно включить через web.config при помощи следующей конфигурации:

<httpCompression directory=»%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files»>
<scheme name=»gzip» dll=»%Windir%\system32\inetsrv\gzip.dll»/>
<dynamicTypes>
<add mimeType=»text/*» enabled=»true»/>
<add mimeType=»*/*» enabled=»false»/>
</dynamicTypes>
<staticTypes>
<add mimeType=»text/*» enabled=»true»/>
<add mimeType=»*/*» enabled=»false»/>
</staticTypes>
</httpCompression>

Проверка сжатия

Сжатие данных на сайте можно проверить большим количеством способов. Первый из них – простой тест на gzip . Второй – более общая проверка сайта на показатели скорости при помощи Google PageSpeed Insights. При отсутствия сжатия на сайте вы получите соответствующее уведомление (или список файлов, для которых сжатие не включено).

Выводы

1. Gzip-сжатие является самым распространенным способом сократить размер передаваемой в Сети информации и поддерживается почти всеми серверами и браузерами.
2. Включить сжатие на сайте очень просто: достаточно добавить в конфигурацию сайта несколько инструкций в зависимости от вашего веб-сервера.
3. Оптимальной степенью сжатия будет 5 или 7 (в зависимости от ваших процессорных ресурсов).
4. Проверить, использует ли ваш сайт сжатие, можно в течение минуты любым из указанных выше инструментов.

Николай Мациевский
Технический директор облачного сервиса Айри.рф, продукта компании WEBO Group, позволяющего ускорить и защитить любой сайт от наиболее распространенных угроз. Профессионально занимается скоростью, надежностью и доступностью веб-сайтов уже много лет. Является автором книг «Разгони свой сайт» и «Реактивные веб-сайты». Основатель первой в России компании, профессионально занимающейся повышением качества и быстродействия сайтов различной сложности — WEBO Group. Работает в составе рабочих групп РАЭК, W3C и объединения разработчиков «Веб-стандарты».

Прокомментировать

2 Комментарий на "Методы сжатия данных в Сети: gzip"

Notify of
Sort by:   newest | oldest | most voted
VIZAVI
Гость

Зависит ли Gzip-сжатие от CMS сайта?

Сергей Петренко
Администратор

Нет, это серверная технология и работает прозрачно для CMS.
Правда, некоторые кэширующие плагины WordPress умеют заранее сжимать кэш и даже сохранять его на диск для мгновенной отдачи, но это особый случай.

wpDiscuz