Методы сжатия данных в Сети: gzip

Gzip-сжатие является самым распространенным способом сократить размер передаваемой в Сети информации и поддерживается почти всеми серверами и браузерами.

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

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

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. Проверить, использует ли ваш сайт сжатие, можно в течение минуты любым из указанных выше инструментов.

preview Кастрация языка запросов Яндекса

Кастрация языка запросов Яндекса

31 января 2017 года в блоге разработчиков поисковой системы Яндекс появилась новость об изменении языка запросов, а именно, о прекращении поддержки ряда операторов: • & – поиск...
preview Синонимы в поисковой выдаче Google

Синонимы в поисковой выдаче Google

Еще в 2010-м году в официальном блоге Google была опубликована статья «Helping computers understand language», в которой рассказывалось об учете синонимов ключевых слов запроса...
preview 5 принципиальных шагов в разработке выигрышной SEO-стратегии

5 принципиальных шагов в разработке выигрышной SEO-стратегии

На дворе 2017, и большинство предпринимателей отдает себе отчет, что их бизнесу нужна поисковая оптимизация
preview 10 советов по использованию Chrome DevTools для SEO-аудита

10 советов по использованию Chrome DevTools для SEO-аудита

Как использовать инструменты разработчика в браузере Google Chrome для выявления и устранения проблем в области SEO
preview Вероятностное SEO или У каждого оптимизатора свой рабочий бубен

Вероятностное SEO или У каждого оптимизатора свой рабочий бубен

Этой статьей я хочу ответить на многочисленные вопросы о том, какие же ссылки продолжают работать, где их брать, в каком количестве и сколько они стоят
preview Скорость реакции – один из ключевых факторов в SEO

Скорость реакции – один из ключевых факторов в SEO

Любая идея, которая появилась у вас в голове, сегодня уже есть в голове у вашего конкурента. Весь вопрос состоит в том, кто более гибко и в короткие сроки реализует эту идею...