GZIP-сжатие данных сайта на сервере
GZIP-сжатие страниц сайта обеспечивает значительное (до 90%) уменьшение объёма соответствующего веб-трафика, увеличивая скорость загрузки сайта и снижая нагрузку на сервер.
Содержание
Что такое GZIP-сжатие данных сайта?
Активация сжатия веб-страниц является простым и действенным способом увеличить скорость загрузки сайта. При активации GZIP-компрессора поток передаваемой от сервера браузеру информации перекодируется на лету. В результате браузер клиента получает трафик в сжатом виде (минимального объёма), который распаковывается им при получении.
GZIP-компрессор использует алгоритм сжатия Deflate, в результате работы которого происходит замена и перекодировка повторяющихся фрагментов данных.
GZIP-сжатие продуктивно применяется по отношению к текстовой информации, которой заполнено большинство веб-ресурсов (в том числе файлы с расширениями .html
, .js
, .css
, .svg
).
Файл | Размер | Размер в сжатом виде | Разница | Коэффициент сжатия |
---|---|---|---|---|
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
, в котором сообщается, какие способы кодирования данных браузер поддерживает:
Если сервер убеждается в том, что браузер поддерживает GZIP-сжатие (получает от браузера HTTP-заголовок Accept-Encoding: gzip
), то он передаёт данные в сжатом виде (если эта возможность активирована), при этом формируя HTTP-заголовок ответа Content-Encoding: gzip
:
Если 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 не принесёт ни какого результата, но создаст лишнюю нагрузку на сервер. Поэтому активация этой функции сопровождается указанием серверу на то, какие типы данных должны подвергаться сжатию.
Тип данных | Категория | Расширение | 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'); ?>