Статьи

Сжатие веб-вывода с использованием mod_gzip и Apache

Сжатие веб-страниц не является новой технологией, но в последнее время оно стало более узнаваемым в умах ИТ-администраторов и менеджеров из-за быстрого возврата инвестиций, который он создает. Расширения сжатия существуют для большинства основных платформ веб-серверов, но в этой статье я остановлюсь на Apache с открытым исходным кодом и решении mod_gzip .

Основы GZIP-кодирования

Идея, лежащая в основе документов, кодирующих GZIP, очень проста. Возьмите файл, который нужно передать веб-клиенту, и отправьте сжатую версию данных, а не необработанный файл. В зависимости от размера файла сжатая версия может работать в диапазоне от 50% до 20% от исходного размера файла.

В Apache это может быть достигнуто с помощью Content Negotiation, которое требует создания двух отдельных наборов файлов HTML: один для клиентов, которые могут обрабатывать GZIP-кодирование, и один для тех, кто не может. Это решение отправляет файлы в формате gzip клиентам, которые их понимают, но не допускают сжатие динамически генерируемых страниц.

Более изящное решение

Более изящным решением является использование mod_gzip , одного из множества дополнительных модулей, доступных для Apache. Я считаю, что это одна из пропущенных жемчужин при разработке высокопроизводительного веб-сервера. Используя этот модуль, сконфигурированные типы файлов будут сжаты с использованием GZIP-кодировки после того, как они были обработаны всеми другими модулями Apache, и до того, как они будут отправлены клиенту. Созданные сжатые данные уменьшают количество байтов, передаваемых клиенту, без каких-либо потерь в структуре или содержимом исходного несжатого документа.

  mod_gzip может быть скомпилирован в Apache как статический или динамический модуль - я решил скомпилировать его как динамический модуль на моем собственном сервере.  Преимущество использования mod_gzip заключается в том, что этот метод не требует mod_gzip на стороне клиента, чтобы заставить его работать.  Что касается серверной стороны, то все, что нужно сделать администратору сервера или сайта: 
  • скомпилировать модуль,
  • отредактируйте соответствующие директивы конфигурации, которые были добавлены в файл httpd.conf,
  • включите модуль в файле httpd.conf и
  • перезагрузите сервер.

Менее чем за 10 минут вы можете обслуживать HTML-файлы, используя GZIP-кодировку.

Как это устроено

Когда запрос получен от клиента, Apache определяет, следует ли вызывать mod_gzip , отмечая, был ли клиент отправил заголовок HTTP-запроса «Accept-Encoding». Если клиент отправляет заголовок (показанный ниже), mod_gzip сжимает выходные данные всех настроенных типов файлов, когда они отправляются клиенту.

 Accept-encoding: gzip 

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

 Content-Type: text/html  Content-Encoding: gzip 

Эти заголовки ответа сервера сообщают, что содержимое, возвращаемое с сервера, кодируется в GZIP, но когда содержимое расширяется клиентским приложением, его следует рассматривать как стандартный файл HTML. Это не только успешно для статических файлов HTML, но также может быть применено к страницам, которые содержат динамические элементы, такие как созданные на стороне сервера (SSI), PHP и другие методы динамического генерирования страниц. Вы также можете использовать его для сжатия ваших каскадных таблиц стилей (CSS) и текстовых файлов. Мой файл httpd.conf устанавливает следующую конфигурацию для mod_gzip :

 mod_gzip_item_exclude         file       .js$  mod_gzip_item_exclude         mime       ^text/css$   mod_gzip_item_include         file       .html$  mod_gzip_item_include         file       .shtml$  mod_gzip_item_include         file       .php$  mod_gzip_item_include         mime       ^text/html$   mod_gzip_item_include         file       .txt$  mod_gzip_item_include         mime       ^text/plain$   mod_gzip_item_include         file       .css$  mod_gzip_item_include         mime       ^text/css$ 

У меня был ограниченный успех при сжатии других форматов файлов, главным образом потому, что Microsoft Internet Explorer, по-видимому, проверяет заголовочное сообщение «Content-Type», прежде чем проверяет заголовочное сообщение «Content-Encoding». Итак, скажем, вы настраиваете свой сервер для GZIP-кодирования PDF-файлов, используя следующие директивы mod_gzip :

 mod_gzip_item_include         file       .pdf$  mod_gzip_item_include         mime       ^application/pdf$ 

Это будет отлично работать как в Mozilla, так и в Opera, так как эти приложения декодируют кодированный в GZIP контент, прежде чем передать его в программу чтения PDF (большинство людей используют Adobe Acrobat Reader).

Однако Internet Explorer просто передает содержимое в кодировке GZIP непосредственно в программу чтения PDF. Как только эта проблема будет устранена в коде MSIE, вы, вероятно, увидите гораздо больше веб-серверов, обслуживающих более широкий спектр GZIP-кодированного контента.

Экономия полосы пропускания

Как видите, документы в кодировке GZIP могут значительно сэкономить на использовании полосы пропускания:

 http://www.pierzchala.com/bio.html  Uncompressed File Size:  3122 bytes  http://www.pierzchala.com/bio.html  Compressed File Size:  1578 bytes   http://www.pierzchala.com/compress/homepage2.html  Uncompressed File Size:  56279 bytes  http://www.pierzchala.com/compress/homepage2.html  Compressed File Size:  16286 bytes 

Как администратор сервера вы можете быть обеспокоены тем, что mod_gzip тяжелую нагрузку на ваши системы, поскольку они сжимают файлы на лету. Я хотел бы отметить, что это, похоже, не касается администраторов Slashdot , одного из самых загруженных веб-серверов в Интернете, которые используют mod_gzip в mod_gzip с очень высоким трафиком.

mod_gzip проекта mod_gzip находится в SourceForge . Попробуй сам.