mod_gzip_static_suffix .gz
# выставляем заголовок Content-Encoding: gzip
AddEncoding gzip .gz
# выставляем минимальный размер для сжимаемого файла
mod_gzip_minimum_file_size 1000
# и максимальный размер файла
mod_gzip_maximum_file_size 500000
# выставляем максимальный размер файла, сжимаемого прямо в памяти
mod_gzip_maximum_inmem_size 60000
# устанавливаем версию протокола, с которой будут отдаваться gzip-файлы
# на клиент
mod_gzip_min_http 1000
# исключаем известные проблемные случаи
mod_gzip_item_exclude reqheader "User-agent: Mozilla/ 4. 0[ 678]"
# устанавливаем сжатие по умолчанию для файлов .html
mod_gzip_item_include file \.html$
# исключаем .css / .js файлы (о них подробнее в следующем разделе)
mod_gzip_item_exclude file \.js$
mod_gzip_item_exclude file \.css$
# дополнительно сжимаем другие текстовые файлы
mod_gzip_item_include mime ^text/html$
mod_gzip_item_include mime ^text/plain$
mod_gzip_item_include mime ^httpd/unix-directory$
# отключаем сжатие для картинок (не дает никакого эффекта)
mod_gzip_item_exclude mime ^image/
# отключаем 'Transfer-encoding: chunked' для gzip-файлов, чтобы
# страница уходила на клиент одним куском
mod_gzip_dechunk Yes
# добавляем заголовок Vary для корректного распознавания браузеров,
# находящихся за локальными прокси-серверами
mod_gzip_send_vary On
Для Apache 2 описанные действия выглядят гораздо проще.
# добавляем Content-Type для всех файлов с расширением .gz
AddEncoding gzip .gz
# включаем сжатие для HTML- и XML-файлов
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
# и для иконок (об этом чуть ниже)
AddOutputFilterByType DEFLATE image/x-icon
# выставляем максимальную степень сжатия (если возникнут проблемы с
# серверной производительностью, следует уменьшить до 7 или 1)
DeflateCompressionLevel 9
# и максимальный размер окна для архивирования
DeflateWindowSize 15
# отключаем архивирование для «проблемных» браузеров
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# добавляем заголовок Vary для корректного распознавания браузеров,
# находящихся за локальными прокси-серверами
Header append Vary User-Agent
# и запрещаем кэширование сжатых файлов для локальных прокси-серверов
Header append Cache-Control private
Полные оптимизированные конфигурации для указанных серверов приведены в восьмой главе.
2.2. CSS и JavaScript в виде архивов
Теперь давайте рассмотрим, каким образом лучше всего будет отдавать CSS- и JavaScript-файлы в архивированном виде. Для обеспечения корректного архивирования, по-видимому, наиболее общий подход будет заключаться в выполнении по порядку следующих пунктов:
проверить, умеет ли клиент принимать файлы в формате gzip-encoded;
обеспечить соответствующий вывод на стороне сервера через gzip-функции либо организовать это непосредственно через веб-сервер (например, Apache);
настроить конфигурационные файлы (или .htaccess), чтобы обеспечить корректный Content-Type.
В данном случае сжатие данных «на лету», возможно, не будет наиболее оптимальным решением, потому что файлы стилей и скриптов изменяются достаточно редко, а мы заставим сервер каждый раз их сжимать. Тем более что лучше самого сервера с архивацией файлов никто не справится.
Статическое архивирование в действии
Есть способ обойтись просто парой строчек в конфигурационном файле (httpd.conf или .htaccess, первое предпочтительнее), если потратить пару минут и самостоятельно заархивировать все необходимые файлы. Предположим, что у нас есть JavaScript-библиотека jquery.js на сервере. Заархивируем ее в jquery.js.gz (при помощи 7-zip или любой другой утилиты, если в работе используется Windows). В итоге, должен появиться файл jquery.js.gz. Его нужно положить в ту же директорию на сервере, что и исходный файл.
Если работать прямо на сервере через командную строку, то достаточно выполнить следующую команду:
gzip jquery.js -c –n -9 > jquery.js.gz
Опция –c создаст новый файл (перенаправляем поток вывода в jquery.js.gz), -n исключит имя файла из архива (оно там только лишние байты занимает), а -9 заставит использовать максимальную степень сжатия. Таким образом, мы получим минимально возможный архив из искомого файла.
В ходе реализации данного решения возникла маленькая, но досадная неприятность. Safari не умеет правильно обрабатывать файлы с расширением .gz: для этого браузера стили и скрипты не могут иметь такого расширения. Как же нам быть? Выход достаточно простой и очевидный.
Нам нужно именовать все архивы стандартным образом, но при этом иметь неархивированную версию для обратной совместимости (например, с дополнительным суффиксом nogzip). Поэтому для подготовки файлов нам будут нужны две команды (jquery здесь используется только в качестве примера):
Читать дальше