Настройка gzip-сжатия и кеширования в Apache2
Статья рассчитана на опытных пользователей, которые уже имеют некоторый опыт настройки Apache 2.4, использовали .htaccess и понимают нафига он нужен. Дальше речь пойдет о том, как настроить кеширование и gzip-сжатие файлов. Хотя правильно будет сказать не файлов, а ответа сервера ( response ). Поскольку ответ может формироваться динамически, те же изображения, JavaScript, CSS и т.д.
Чуть теории
Кеширование. Основной принцип заключается в том, что обмениваясь заголовками, сервер сообщает клиенту (браузеру) что такой-то контент можно закешировать на продолжительное время — неделя, месяц, год.. После чего, при последующих запросах этого контента, браузер будет вытягивать данные из кеша. Лафа может закончиться, когда:
- Время жизни кеша истекло;
- Пользователь очистил кеш вручную — Ctrl + F5 ,
- Закончилось доступное под кеш пространство и закешированные данные был перезаписан более новым;
- Данные были обновлены на стороне сервера;
Используя кеширование вы снижаете нагрузку на сервер и экономите клиенту трафик и время. Однако нужно понимать, что у матерого серфера кеш может полностью затираться ежедневно, а то и чаще — все зависит от количества посещаемых сайтов и объема доступной под кеш квоты.
Сжатие. Полезная штука, которая позволяет сжимать (с помощью gzip) данные на сервере и распаковывать после получения на клиенте (в браузере). Клиент должен уметь распаковывать сжатые данные, о чем он сообщает в заголовке Accept-Encoding, например:
Опять же мы экономим на трафике и, соответственно, сокращаем время ожидания. Но, при этом, чуть больше нагружаем ЦП при распаковке данных.
Необходимые модули Apache2
Для включения кеширования нам нужен модуль mod_deflate , для кеширования — mod_headers или mod_expires . Также mod_headers вам пригодится чтобы удалять заголовок ETag, он лишний и могут быть проблемы с кешированием через mod_header при включенном сжатии. Для включение выполните:
Для отключения модулей воспользуйтесь командой a2dismod :
Итоговый .htaccess
Сразу приведу пример файла .htaccess, в котором настроено кеширование и сжатие. Файл будет содержать краткие примечания, а ниже разберем все директивы и правила более детально.
Примечание
FilesMatch и Files
сопоставляют шаблон только с именем файла, поэтому вы не можете указывать пути к файлам в этих директивах.
Чтобы указать область видимости кеша, используйте следующие правила:
gzip-сжатие
Apache2 больше не поддерживает модуль mod_gzip, теперь основным модулем является mod_deflate, который мы включили ранее. Чтобы проверить что сжатие работает — убедитесь что ответ содержит заголовок Content-Encoding:
Сжатие может быть настроено для определенных MIME-типов файлов, за это отвечает правило AddOutputFilterByType .
Внимание!
Модуль deflate при сжатии может удалять заголовок Content-Length, поскольку длина сжатого ответа неизвестна на момент передачи заголовков. Однако, при удалении из ответа заголовка ETag — ситуация нормализуется. Почему?
Примечание
Сжимать изображения и видео файлы особого смысла нет — толку это даст мало, поскольку jpeg или gif уже сами по себе являются сжатыми форматами.
Кеширование
Для кеширования мы активировали модули mod_headers и mod_expires . Эти модули позволяют устанавливать заголовки в ответе сервера и подсказать браузеру схему кеширования.
Внимание!
Я замечал не понятное для меня поведение при включении mod_deflate и настройке кеширования через mod_headers . Пропадал заголовок Content-Length и кеширование переставало работать. Решение нашлось — удаление заголовка из ответа:
В случае с mod_expires сжатие и кеширование работало нормально даже с выключенным модулем mod_headers . Отпишитесь, если вы знаете почему происходит так.
Немного в цифрах
Проанализируем профит от gzip-сжатия на примере библиотеки jquery-2.0.3.js. По факту, файл (не минифицированный) весит 236,5KB. mod_deflate сжимает его до 70 KB — не плохо. При следующем запросе, если включено кеширование, даже эти 70 KB не будут загружаться по сети — браузер достанет jQuery из кеша.
Сжимаем сайт при помощи mod_deflate
Решил заняться оптимизацией скорости загрузки блога и решил его прогнать при помощи сервиса webo.in, в рекомендациях по оптимизации было написано:
Решил начать с архивирования файлов. Перейдем к mod_deflate
- Apache 1.3 — mod_gzip и mod_deflate (разработанный Сысоевым, автором nginx). Подробнее можно почитать у Лиссяры -> mod_gzip — сжатие html страниц «на лету»
- Apache 2.2 — mod_deflate
Так как у меня версия Apache 2.2.8 на сервере, то буду рассказывать про второй пункт. Для начала необходимо установить данный модуль (желательно ставить через порты), но у меня он был уже установлен, я его просто активировал в httpd.conf
Открываем файл конфигурации Apache
И добавляем правило:
AddOutputFilterByType — тут назначаем фильтр DEFLATE для миме типов: text/html text/plain text/xml
DeflateCompressionLevel — степень gzip-компрессии от 1 до 9 (Инструмент для расчета степени gzip-сжатия в помощь)
Проверяем наши настройки
Проверяем сжатие
ну или посмотрите в своём любимом броузере (для FireFox рекомендую Live Http Headers)
Если видим строку «Content-Encoding: gzip», то всё в порядке! Идём дальше, если нет, проверьте предыдущие шаги.
Теперь в фильтр можно добавить ещё типы: text/css и text/javascript
Логи храним в отдельном файле
Далее, указываем в виртуальных хостах путь до лога, например:
Комментарии
Спасибо за красивые картинки и внятное изложение 🙂
В книжке про оптимизацию (в восьмой главе) дополнительно рассмотрены конфигурации для различных серверов, в том числе, и для Apache 2. Там и про сжатие, и про кэширование.
Спасибо за книгу и хороший отзыв, книгу обязательно почитаю и пропиарю 😉
Article about mod_deflate settings like on Amazon EC2 AMI
http://railsgeek.com/2008/12/16/apache2-httpd-improving-performance-mod_deflate-gzip
Хм. Какой кошмар!
Да уж может конечно и просто написано, но не для таких чайникофф как я. Мне мой хостер уже 3 письмо пишет, что нагрузка в 2 раза превышает тарифную 50 чего то там. Вот попытаюсь счас воспользоваться вашими рекомендациями, если конечно не запорю че нить
Вот, что мне ответил хостер на вопрос по поводу сжатия:
Здравствуйте
Функции сжатия у нас выполняет кеширующий прокси-сервер nginx. mod_deflate для Apache отключен, так как в нем нет необходимости.
Также сжатие отдаваемой посетителю информации никак положительно не скажется на создаваемой скриптами нагрузке.
Вам необходимо оптимизировать сами скрипты, например, включив кеширование или изменив алгоритмы их работы на более оптимальные.
Как правильно включить сжатие файлов?
Для чего нужна эта конструкция — IfModule mod_deflate.c ?
Что выполняет этот пункт — BrowserMatch ?
Настройка в .htaccess
![]()
Для чего нужна эта конструкция — IfModule mod_deflate.c ?
Проверяет, активирован ли необходимый модуль mod_deflate .
Что выполняет этот пункт — BrowserMatch
Позволяет задать поведение на основе заголовка user-agent. Используется для установки env-переменных , которые использует Apache.
Как правильно прописать настройки?
Использовать комбинацию из двух процитированных вариантов.
Раз уж в первом варианте делается проверка одного из используемых модулей, пусть делается проверка и для второго.
Данный фрагмент файла .htaccess проверяет наличие модуля mod_deflate и, если он доступен, включает сжатие для перечисленных типов файлов. После этого идет проверка наличие модуля mod_setenvif и, если он доступен, изменяются параметры сжатия для некоторых браузеров, которые некорректно обрабатывают сжатые файлы.
Установка и настройка модуля mod_deflate в CentOS 7
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, например:
Это снизит уровень сжатия, в результате чего файлы станут объёмнее. Однако так 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».