новости
статьи
.sysadmin

5 простых способов “ускорения” сайта

сжатие файлов стилей (.css) и JavaScript файлов (.js)

Если на вашем сервере установлен Apache 2, то просто добавьте следующие директивы в ваш файл .htaccess, а лучше в httpd.conf:

<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>


Директива SetOutputFilter DEFLATE добавляет модуль mod_deflate, который сжимает файлы, к выходным фильтрам, а блок FilesMatch ограничивает действие этого фильтра только файлами js и css.
Все просто и легко.

Теперь смотрим на результат. Для этого пользователям FireFox рекомендую воспользоваться связкой FireBug + YSlow.



Рис. 1.

Результат говорит сам за себя.

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

Теперь про поддержку сжатых файлов браузерами. Для этого обратимся на сайт http://www.http-compression.com. Ситуация такова:

- Microsoft Internet Explorer. Поддерживает сжатие с версии 4.0.

- Mozilla Firefox. Сжатие поддерживается всеми версиями. (Еще один повод пользоваться огненной лисой).

- Netscape Navigator. Поддержка сжатия началась с версии 4.06, но с серьезными ошибками, которые были устранены с версии 6.02.

- Opera. Полная поддержка сжатия включена, начиная с версии 5.12.

использование HTTP-заголовка Expires

Графика, флеш, js-файлы, файлы стилей и пр. довольно редко обновляются на сайте, поэтому пользователю, который к вам попал не в первый раз, незачем вновь скачивать эти файлы, раз они не изменились. Чтобы "научить" браузер пользователя не скачивать эти файлы, а брать их из кеша, существует HTTP заголовок Expires. Он устанавливает время, до которого браузер может использовать файл из собственного кеша.

Уточнение: Данные заголовки, помимо браузера, используют также прокси-сервера, кеширующие сервера и т.п.

В файле httpd.conf или .htaccess пишем следующее:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>


Опять же, перечисляем расширения файлов, на которые должно распространяться действие директивы. И указываем время Thu, 15 Apr 2010 20:00:00 GMT. То есть около 3 лет, но можно и больше :)

заголовки Cache-Control

С помощью заголовка Cache-Control можно указать, как долго прокси-сервера могут хранить файлы в кеше. Добавление в заголовок must-revalidate заставляет проверять также значение ETag для обнаружения изменений.

# 480 недель
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

# 2 дня
<FilesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=172800, public, must-revalidate"
</FilesMatch>

# 2 часа
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=7200, must-revalidate"
</FilesMatch>


Либо вместе с заголовком Expires

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "public"
Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>


отключение заголовка ETag

Механизм ETag (Entity Tag) предназначен для обнаружения новых версий запрошенных файлов. Когда сервер отсылает клиенту файл, он добавляет заголовок ETag, в который записывает хеш отправляемого файла.

Клиент же, при повторном запросе, добавляет заголовок If-None-Match, значение которого равно хешу файла в кеше. Если значение совпадают, то сервер возвращает ответ HTTP/1.1 304 Not Modified, а если не совпадают, тогда возвращает новую версию файла.

Таким образом, удаление заголовка ETag в ответах сервера отключает этот механизм. Что заставляет кеш клиента использовать только значения Expires и Cache-Control (если вы не используете Expires и Cache-Control не удаляйте ETag!). Выигрыш такого подхода в том, что между клиентом и сервером отпадает надобность обмениваться запросами проверки новых версий (If-None-Match и 304 Not Modified).

Отключение заголовка делается следующим образом:

Header unset ETag
FileETag None


А вот пример обмена запросами между клиентом и сервером с использованием ETag.

Ответ сервера на первый запрос файла /i/yahoo.gif:

HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195


Повторный запрос файла /i/yahoo.gif и ответ сервера:

GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified


удаление заголовка Last-Modified

Удаление заголовка Last-Modified вместе с заголовком ETag позволит полностью избежать использования запросов проверки новых версий файлов If- Modified-Since и If-None-Match. Таким образом файлы будут кешироваться только на основании значений Cache-Control и Expires.

Примечание: Не удаляйте Last-Modified и ETag для .html файлов.
Делается это следующим образом:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css)$">
Header unset Last-Modified
</FilesMatch>


Вот и все. Продуманное и правильное использование сжатия и кеширование позволит существенно сократить трафик между клиентом и сервером.



Сипягин Максим, ApacheDev.ru
обсудить статью
© сетевые решения
.
.