Mod_deflate – это модуль Apache, позволяющий сжимать вывод веб-сервера перед отправкой клиенту. Обработанные модулем mod_deflate данные уменьшаются в объёме, благодаря чему клиент способен быстрее их обработать. Это очень важно для клиентов с низкой пропускной способностью; кроме того, это учитывается поисковыми системами при оценке работы сайта и помещении его в рейтинг.
Также mod_deflate может восстанавливать сжатые данные. Эта техника применяется в случае, если Apache используется в качестве обратного прокси-сервера, и вы хотите, чтобы контент, который проходит через прокси-сервер, был также обработан. В целом, этот метод имеет довольно узкую сферу применения. Потому данное руководство сосредоточено на использовании mod_deflate для сжатия данных.
Требования
Это руководство написано для CentOS 7. Установка и настройка модулей, как правило, одинакова для всех операционных систем, но расположение конфигурационных файлов в разных системах может отличаться.
Для выполнения инструкций нужно предварительно установить Apache 2.4.0+; чтобы узнать, как установить Apache, читайте соответствующий раздел данного руководства.
Все команды руководства рекомендуется запускать с привилегиями sudo. Подробнее об этом можно прочесть в этой статье.
Установка mod_deflate
Модуль mod_deflate установлен и включён на стандартной установке Apache в CentOS 7. Чтобы убедиться в этом, запустите apachectl (интерфейс управления сервером Apache), отфильтровав вывод при помощи grep по слову deflate:
apachectl -t -D DUMP_MODULES |grep deflate
На экране должна появиться строка deflate_module (shared). Если эта строка не появилась, значит, модуль не установлен. Устраните эту неполадку:
- Убедитесь, что модуль установлен. Файл модуля является частью пакета httpd, который был установлен ранее (см. раздел Требования). По умолчанию он находится в /etc/httpd/modules/mod_deflate.so. кроме того, веб-сервер должен иметь возможность открывать файл; для этого установите права на файл в формате 755.
- Проверьте, загружен ли модуль. Откройте конфигурационный файл модулей Apache (/etc/httpd/conf.modules.d/00-base.conf) и убедитесь, что он содержит следующую строку:
LoadModule deflate_module modules/mod_deflate.so
Примечание: Не забудьте перезапустить Apache после внесения любых изменений в настройки.
sudo apachectl restart
Настройка mod_deflate
Сначала нужно казать, какой тип файлов нужно сжимать. С одной стороны, путем сжатия можно значительно уменьшить в размере текстовые форматы, и поэтому имеет смысл применить его к файлам HTML, CSS или JavaScript. С другой стороны, многие мультимедийные форматы (такие как Flash) и изображения уже сжаты, и дополнительное сжатие будет бесполезно.
Чтобы настроить mod_deflate, создайте новый конфигурационный файл /etc/httpd/conf.d/mod_deflate.con и поместите в него следующий код:
<filesMatch "\.(js|html|css)$">
SetOutputFilter DEFLATE
</filesMatch>
Этот код значит, что файл будет сжат директивой SetOutputFilter, если его расширение – .js, .html или .css. при необходимости добавьте в настройки другие расширения текстовых файлов.
Примечание: Вышеупомянутый код нужно поместить в файл /etc/httpd/conf/httpd.conf. Тем не менее, лучше хранить такие конфигурации в отдельном файле. Для этого в CentOS 7 любой файл с расширением .conf, хранящийся в каталоге /etc/httpd/conf.d/, автоматически загружается директивой IncludeOptional conf.d / *.conf в конец главного конфигурационного файла Apache.
Кроме того, модуль mod_deflate имеет несколько важных опций конфигурации:
- DeflateCompressionLevel задаёт уровень сжатия. По умолчанию установлен 9 – наивысший уровень. Наиболее низкому уровню соответствует 1. Чем выше уровень сжатия, тем меньше будет вывод, и тем выше уровень нагрузки CPU.
- DeflateMemLevel задаёт используемый объём памяти библиотеки сжатия zlib. По умолчанию задан уровень 9 (опять же, наивысший уровень). Чтобы рассчитать допустимый объём, умножьте значение DeflateMemLevel на 16К.
- DeflateWindowSize устанавливает размер окна сжатия. По умолчанию задана максимальная величина 15. Чем больше это значение, тем выше уровень сжатия (снова за счёт ресурсов сервера).
В большинстве случаев можно оставить настройки по умолчанию. Однако если вы считаете, что производительность сервера значительно ухудшилась после включения mod_deflate, установите более низкие значения в конфигурационном файле /etc/httpd/conf.d/mod_deflate.conf, например:
DeflateCompressionLevel 1
Это снизит уровень сжатия, в результате чего файлы станут объёмнее. Однако так mod_deflate станет использовать меньше CPU. Не забудьте перезапустить Apache, чтоб обновить настройки.
Тестирование mod_deflate
Существует много способов проверить работу mod_deflate, но проще всего использовать для этого wget, неинтерактивный загрузчик. Если wget не был установлен на сервер CentOS 7 ранее, установите его с помощью команды:
sudo yum install -y wget
Для тестирования нужен текстовый файл в несколько сотен килобайт как минимум. Если на сервере нет такого файла, загрузите JQuery (популярную библиотеку JavaScript) и загрузите её на сайт. Если же вы не знаете, куда поместить файл, подгрузите его в стандартный каталог document root (для Apache это /var/www/html/).
Примечание: Чтобы mod_deflate сжимал вывод, клиент (обычно браузер) должен поддерживать сжатие. Если клиент не поддерживает сжатие файлов, они будут отправлены в исходном виде.
Подгрузив тестовый файл на сайт, загрузите его при помощи wget. Тестирование можно выполнить как на локальной машине, так и на сервере.
wget --header="Accept-Encoding: gzip" http://<your_server_ip>/jquery-1.11.3.js
Эта команда загрузит jquery-1.11.3.js file с сервера Apache. Чтобы проверить сжатие, в команде используется аргумент Accept-Encoding: gzip.
Загруженный таким образом файл jquery-1.11.3.js будет иметь объём 83KB. На самом деле, это не совсем оригинальный файл JavaScript, он должен быть дополнительно извлечен клиентом, в результате чего на стороне клиента также возникает некоторый расход ресурсов. Однако размер передаваемого по сети файла будет 83Кб, а это более чем в три раза меньше, чем исходный файл (278K).
Чтобы подтвердить этот расчет, сначала проверьте размер загруженного файла с помощью команды:
ls -lah jquery-1.11.3.js
-rw-r--r-- 1 user user 83K Apr 28 12:20 jquery-1.11.3.js
Затем сравните результат с исходным файлом при помощи той же команды ls:
ls -lah /var/www/html/jquery-1.11.3.js
-rw-r--r-- 1 apache apache 278K Apr 28 12:20 /var/www/html/jquery-1.11.3.js
Заключение
Как видите, mod_deflate может значительно ускорить сайт. Чтобы продолжить оптимизацию сайта, читайте руководство «Кэширование контента при помощи модулей Apache».