GZIP-сжатие данных сайта на сервере

GZIP-сжатие страниц сайта обеспечивает значительное (до 90%) уменьшение объёма соответствующего веб-трафика, увеличивая скорость загрузки сайта и снижая нагрузку на сервер.

GZIP-сжатие

Что такое GZIP-сжатие данных сайта?

Активация сжатия веб-страниц является простым и действенным способом увеличить скорость загрузки сайта. При активации GZIP-компрессора поток передаваемой от сервера браузеру информации перекодируется на лету. В результате браузер клиента получает трафик в сжатом виде (минимального объёма), который распаковывается им при получении.

GZIP-компрессор использует алгоритм сжатия Deflate, в результате работы которого происходит замена и перекодировка повторяющихся фрагментов данных.

GZIP-сжатие продуктивно применяется по отношению к текстовой информации, которой заполнено большинство веб-ресурсов (в том числе файлы с расширениями .html, .js, .css, .svg).

Сжатие CSS- и JS-файлов фреймворка UiKit v2.27.4
Файл Размер Размер в сжатом виде Разница Коэффициент сжатия
uikit.js 119 КБ 22 КБ 97 КБ 82%
uikit.min.js 57 КБ 15 КБ 42 КБ 74%
uikit.css 181 КБ 30 КБ 151 КБ 83%
uikit.min.css 105 КБ 19 КБ 86 КБ 81%

Данные таблицы наглядно демонстрируют очень высокую эффективность применения GZIP-сжатия как для обычных, так и для предварительно минифицированных файлов.

Коэффициент сжатия может отличаться в зависимости от содержания и размера файла и может достигать значения в 90%.

Аргументы в пользу применения GZIP-сжатия данных сайта:

Уменьшение объёма веб-трафика
Это особенно актуально в мобильных сетях: не все используют безлимитный интернет на мобильных устройствах.
Снижение нагрузки на сервер
несмотря на то, что серверу постоянно приходится сжимать передаваемые данные, нагрузка снижается за счет уменьшения их объёма.
Увеличение скорости загрузки сайта
Уменьшается объём трафика — сайт загружается быстрее.
Поддержка всеми современными браузерами
Сжатые данные будут быстро распаковываться и отображаться в любых современных браузерах.

Поддержка GZIP-сжатия браузерами

Как уже отмечалось, современные браузеры, такие как Chrome, Firefox, Edge, а также мобильные их версии, без проблем формируют веб-страницы из полученной от сервера сжатой информации.

Прежде, чем послать браузеру сжатые данные, сервер получает от него HTTP-заголовок запроса Accept-Encoding, в котором сообщается, какие способы кодирования данных браузер поддерживает:

Accept-Encoding: gzip, deflate, br
Accept-Encoding: gzip, deflate, br

Если сервер убеждается в том, что браузер поддерживает GZIP-сжатие (получает от браузера HTTP-заголовок Accept-Encoding: gzip), то он передаёт данные в сжатом виде (если эта возможность активирована), при этом формируя HTTP-заголовок ответа Content-Encoding: gzip:

Accept-Encoding: gzip, deflate, br
Accept-Encoding: gzip, deflate, br

Если HTTP-заголовок запроса браузера Accept-Encoding не подтверждает поддержку GZIP, или передача сжатых данных не настроена на сервере, то данные передаются в несжатом виде.

Как проверить GZIP-сжатие данных сайта?

На многих веб-серверах по умолчанию применяется динамическое GZIP-сжатие веб-страниц на лету. Чтобы проверить сжатие GZIP онлайн для определённого сайта, существует ряд способов, включающих утилиты для браузера и специализированные веб-сервисы.

Сервис PageSpeed Insights

Онлайн-сервис PageSpeed Insights позволяет оценить практически все значимые факторы, влияющие на скорость загрузки веб-страницы, в том числе и сжатие передаваемых данных.

Если сжатие не осуществляется, то в списке актуальных для проверенной веб-страницы рекомендаций по оптимизации скорости загрузки будет содержаться рекомендация «Включите сжатие» со списком всех ресурсов, вес которых можно уменьшить при передаче, а также коэффициент сжатия и результат уменьшения для каждого отдельного ресурса и веб-страницы в целом:

Сервис HTTP Compression Test

Сервис HTTP Compression Test является узконаправленным и определяет, активировано ли сжатие данных для веб-страницы, а также общий объём сжимаемых данных страницы в обычном и сжатом виде. Если GZIP-сжатие не применяется, то сервис отображает, насколько результативным будет его активация:

Сервис GIDZipTest

Сервис GIDZipTest также определяет, передаёт ли страница веб-трафик в сжатом виде в режиме онлайн. Но кроме этого отчет содержит информацию о возможных результатах применения GZIP-компрессии, а также сводку по передаваемым HTTP-заголовкам веб-страницы:

Виды GZIP-сжатия данных сайта

Существует статическое и динамическое GZIP-сжатие данных.

Динамическое сжатие

Динамическое GZIP-сжатие подразумевает сжатие сервером указанных в конфигурационных файлах данных при передаче браузеру («на лету»). Чтобы задействовать этот тип сжатия данных сайта, достаточно активировать на сервере необходимые модули.

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

Статическое GZIP-сжатие подразумевает передачу сервером предварительно сжатых файлов, размещенных на сайте с расширением .gz.

Чтобы обеспечить статическое сжатие данных сайта, необходимо предварительно сжать нужные статические файлы (CSS, JS, SVG) в формате GZIP, например с помощью архиватора 7zip, и разместить в соответствующие директории с расширениями .gz. После этого необходимо внести в конфигурационный файл сервера директивы, обеспечивающие передачу сжатых файлов вместо обычных.

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

Как обеспечить тот или иной тип сжатия для сайта читайте далее.

Как включить GZIP-сжатие данных сайта?

Чтобы включить сжатие, необходимо убедиться, что веб-сервер поддерживает эту возможность. Можно уточнить этот момент в службе поддержки хостинг-провайдера. Если сжатие поддерживается, то нужно внести изменения в конфигурационные файлы.

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

Список типов данных, актуальных для GZIP-сжатия
Тип данных Категория Расширение MIME-тип
Обычный текст - - text/plain
HTML Разметка .html text/html
XHTML Разметка .xhtml application/xhtml+xml
XML Разметка .xml application/xml, text/xml
CSS Стили .css text/css
JavaScript Скрипты .js text/javascript, application/javascript, application/x-javascript
SVG Графика .svg image/svg+xml
OTF Шрифт .otf font/otf font/opentype, application/font-otf, application/x-font-otf
TTF Шрифт .ttf font/ttf, font/truetype, application/font-ttf, application/x-font-ttf

Включение GZIP на сервере Apache

На серверах Apache (от версии 2) применяется модуль mod_deflate, включение которого обеспечивает динамическое (на лету) сжатие передаваемых сервером данных.

Динамическое сжатие на Apache

Чтобы включить динамическое GZIP-сжатие на сервере Apache, нужно разместить в файле httpd.conf (при возможности) или в .htaccess (размещается в корневой папке сайта) следующий код:

# активация GZIP для перечисленных типов данных в .htaccess:
<IfModule deflate_module>
	<IfModule filter_module>
		AddOutputFilterByType DEFLATE text/plain text/html text/xml application/xml application/xhtml+xml application/rdf+xml application/rss+xml application/atom+xml image/svg+xml text/css text/javascript application/javascript application/x-javascript font/otf font/opentype application/font-otf application/x-font-otf font/ttf font/truetype application/font-ttf application/x-font-ttf
	</IfModule>
</IfModule>

Директива AddOutputFilterByType DEFLATE содержит список всех MIME-типов данных, которые должны подвергаться сжатию, разделённых пробелом. Код получился не удобным для восприятия. Для его оптимизации можно применять символ обратной косой черты \ перед переносом строк в директиве. В результате перенос строки не будет считаться таковым и код станет более комфортным для восприятия:

<IfModule deflate_module>
	<IfModule filter_module>
		AddOutputFilterByType                                                         \
		 DEFLATE                                                                      \
		  text/plain text/html                                                        \
		  text/xml application/xml application/xhtml+xml                              \
		  application/rdf+xml application/rss+xml application/atom+xml image/svg+xml  \
		  text/css text/javascript application/javascript application/x-javascript    \
		  font/otf font/opentype application/font-otf application/x-font-otf          \
		  font/ttf font/truetype application/font-ttf application/x-font-ttf
	</IfModule>
</IfModule>

Типы данных для сжатия в файле .htaccess указывается в формате MIME, в качестве разделителей могут выступать пробел(ы) и перенос(ы) строк, если перед переносом строки поставить символ \ (экранирование).

Также для отдельных категорий типов данных можно указывать отдельную директиву AddOutputFilterByType DEFLATE, чтобы избежать использования символа экранирования:

<IfModule deflate_module>
	<IfModule filter_module>
		AddOutputFilterByType DEFLATE text/plain text/html
		AddOutputFilterByType DEFLATE text/xml application/xml application/xhtml+xml		
		AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml image/svg+xm
		AddOutputFilterByType DEFLATE text/css text/javascript application/javascript application/x-javascript
		AddOutputFilterByType DEFLATE font/opentype application/font-otf application/x-font-otf
		AddOutputFilterByType DEFLATE font/truetype application/font-ttf application/x-font-ttf
	</IfModule>
</IfModule>

Условия выполнения сжатия (доступность модулей mod_deflate и mod_filter) в файле .htaccess могут быть представлены в другом виде:

<IfModule mod_deflate.c>
	<IfModule mod_filter.c>
		# директивы
	</IfModule>
</IfModule>

После активации GZIP в файле .htaccess следует проверить его работу. Если сайт работает не на Apache, или модуль mod_deflate не активирован, то сжатие работать не будет.

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

Статическое сжатие на Apache

После предварительного сжатия и размещения файлов с расширением .gz на сайте, в файл конфигурации (httpd.conf или .htaccess) необходимо прописать следующие строки:

RewriteEngine On
AddEncoding gzip .gz
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz [QSA,L]

Пояснение значений директив:

RewriteEngine On
Активирует модуль перенаправлений (редиректов).
AddEncoding gzip .gz
Указывает, что файлы с расширением .gz сжаты методом GZIP.
RewriteCond %{HTTP:Accept-encoding} gzip
Проверяет, сможет ли браузер распаковать сжатые файлы.
RewriteCond %{REQUEST_FILENAME}.gz -f
Проверяет наличие сжатого файла с расширением .gz.
RewriteCond %{REQUEST_FILENAME}.gz -f
При наличии сжатого файла с расширением .gz, сервер отдаёт его вместо запрашиваемого файла.

Включение GZIP на сервере Nginx

Для сжатия на серверах Nginx применяются модули ngx_http_gzip_module (для динамического сжатия) и ngx_http_gzip_static_module (для динамического сжатия).

Динамическое сжатие на Nginx

Чтобы активировать модуль ngx_http_gzip_module необходимо в конфигурационном файле nginx.conf прописать следующий код:

gzip on;
gzip_comp_level 5;
gzip_types text/plain text/html text/xml application/xml application/xhtml+xml application/rdf+xml application/rss+xml application/atom+xml image/svg+xml text/css text/javascript application/javascript application/x-javascript font/otf font/opentype application/font-otf application/x-font-otf font/ttf font/truetype application/font-ttf application/x-font-ttf;

Пояснение значений директив:

gzip on
Активирует модуль.
gzip_comp_level 5
Устанавливает степень сжатия на 5 из 9. Опытным путём доказано, что устанавливать значение выше 5 не целесообразно, т. к. это увеличит нагрузку на сервер, при этом данные будут сжиматься не значительно.
gzip_types
MIME-типы данных для сжатия, разделённые пробелами.

Описание всех возможных директив модуля ngx_http_gzip_module смотрите на официальном сайте.

Статическое сжатие на Nginx

Для обеспечения передачи сервером предварительно сжатых файлов в файл конфигурации nginx.conf нужно добавить строку:

gzip_static on;

Совместное функционирование модулей

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

gzip on;
gzip_comp_level 5;
gzip_static on;
gzip_types text/plain text/html text/xml application/xml application/xhtml+xml application/rdf+xml application/rss+xml application/atom+xml image/svg+xml text/css text/javascript application/javascript application/x-javascript font/otf font/opentype application/font-otf application/x-font-otf font/ttf font/truetype application/font-ttf application/x-font-ttf;

Это обеспечит передачу предварительно сжатых файлов с расширением .gz при их наличии, а при отсутствии будет происходить динамическое сжатие передаваемых данных.

Включение GZIP с помощью PHP

Применять GZIP-сжатие посредством PHP не рекомендуется, т. к. проще и эффективнее использовать возможности сервера.

Реализация GZIP-сжатия данных веб-страниц возможна средствами PHP, в частности с помощью PHP-модуля zlib (должен быть активирован).

Например, для сжатия веб-страницы можно разместить перед тегом html PHP-файла, формирующего саму страницу, следующий код:

<?php
# сжатие веб-страницы
ob_start('ob_gzhandler');
?>

Ссылки

Автор:
Оцените материал:
5.0/5

Добавить комментарий