Опубликован: 16.02.2009 | Доступ: свободный | Студентов: 1429 / 138 | Оценка: 4.26 / 4.17 | Длительность: 16:10:00
ISBN: 978-5-9963-0024-2
Лекция 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 заставит использовать максимальную степень сжатия. Таким образом, мы получим минимально возможный архив из искомого файла.