Сжатие веб-страниц не является новой технологией, но в последнее время оно стало более узнаваемым в умах ИТ-администраторов и менеджеров из-за быстрого возврата инвестиций, который он создает. Расширения сжатия существуют для большинства основных платформ веб-серверов, но в этой статье я остановлюсь на 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 . Попробуй сам.