Опубликован: 16.02.2009 | Уровень: специалист | Доступ: платный
Лекция 2:

Уменьшение размера

Окончательные выводы

Собственно, графики говорят сами за себя. Если у вас HTML-файлы в среднем больше 4 Кб, то появится ощутимый выигрыш для большинства пользователей при включенном gzip на сервере (даже если этот сервер находится на весьма "слабенькой" машине). В случае маленьких файлов и(или) медленного в вычислениях сервера, стоящего, однако, на быстром канале, будет экономичнее не сжимать файлы.

Хочется также обратить внимание на то, что, отдав пользователю данные быстрее (через gzip -сжатие), мы тем самым освободим часть серверных ресурсов, что может оказаться существенным подспорьем для высоконагруженных проектов.

В общем случае gzip -сжатие позволяет существенно ускорить доставку HTML-файла пользователю, не увеличивая нагрузку на сервер. Если же использовать статическое архивирование (готовые архивы хранить на сервере и обновлять только в случае необходимости), то выгода просто очевидна.

Конфигурируем Apache 1.3

Давайте рассмотрим, как можно настроить некоторые серверы для выдачи текстового содержания в виде архивов. Ниже приведен участок конфигурационного кода для Apache 1.3, позволяющий подключить gzip -сжатие. Основные директивы даны с комментариями.

<IfModule mod_gzip.c>
# включаем gzip
mod_gzip_on          Yes

# если рядом с запрашиваемым файлом есть сжатая версия с расширением 
.gz, то # будет отдана именно она, ресурсы CPU расходоваться не будут
mod_gzip_can_negotiate    Yes

# используем при статическом архивировании расширение .gz
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
</IfModule>

Конфигурируем Apache 2

Для 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

# и запрещаем кэширование сжатых файлов для локальных прокси-серверов
<FilesMatch .*\.(html|phtml|php|shtml)$ >
	Header append Cache-Control private
</FilesMatch>

Полные оптимизированные конфигурации для указанных серверов приведены в восьмой главе.

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 заставит использовать максимальную степень сжатия. Таким образом, мы получим минимально возможный архив из искомого файла.

Мария Кравцова
Мария Кравцова
Россия, Сочи, РГПУ им. А.И.Герцена, 1997
Екатерина Архангельская
Екатерина Архангельская
Россия, СПбГУАП