Янв 21 2009
Написал: Bambino в Оптимизация сайтов, Технологии
Я тут недавно потюнил .htacess на предмет увеличения скорости загрузки блога. По-моему субъективному мнению скорость загрузки действительно возросла. Плюс дополнительные настройки работы с кэшем. Вообщем решил поделиться полезными алгоритмами.
Как уже наверняка, многие знаю, последние версии практически всех Интернет-браузеров поддерживают возможность разархивировать контент, переданный веб-сервером в формете gzip, на лету. Можно воспользоваться этой фишкой и предварительно сжимать gzip’ом страницы блога перед отправкой их конечному посетителю . Для этого, правда, понадобится наличие подлкюченного Apache-модуля mod_gzip. Если ваш хостер включил данный модуль по-умолчанию, то вы можете заставить его работать, добавив следущие строки к .htaccess:
<ifModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* </ifModule>
Очевидно, что теперь все текстовые файлы, а также ресурсы указанных mime-типов будут сжиматься алгоритмом gzip.
Если же модуль не подключен, то этот вариант не сработает. Однако есть запасной вариант, правда достаточно ресурсоёмкий:
php_value output_handler ob_gzhandler
Идём дальше. При первом посещении вашего сайта браузер посетителя выполняет несколько запросов к серверу (пока скачаются необходимые файлы, скрипты, изображения). Чтобы этого не происходило каждый раз, вы с помощью заголовков Expires и Cache-Control сможете кэшировать такие файлы. После чего лишние запросы к серверу не будут осуществляться при последовательном просмотре страниц.
Чтобы настроить заголовки Expires необходимо добавить следующие строки в файл .htaccess:
<ifModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 3600 seconds" ExpiresByType text/html "access plus 3600 seconds" ExpiresByType image/gif "access plus 2592000 seconds" ExpiresByType image/jpeg "access plus 2592000 seconds" ExpiresByType image/png "access plus 2592000 seconds" ExpiresByType text/css "access plus 604800 seconds" ExpiresByType text/javascript "access plus 604800 seconds" ExpiresByType application/x-javascript "access plus 604800 seconds" </ifModule>
Как вы видите практически файлы всех типов, кроме text/html будут кэшироваться и срок их хранения достаточно долгий (ну не каждый же час меняются, например, изображения).
Теперь, что касается Cache-Control. Этому заголовку подчиняются все кэширущие системы в независимости от того осуществляется ли запрос к серверу или ответ от него. Настраиваем заголовок добавление следующих строк всё в тот же файл .htaccess:
<ifModule mod_headers.c> # 30 дней <filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$"> Header set Cache-Control "max-age=2592000, public" </filesMatch> # 7 дней <filesMatch "\.(css|js)$"> Header set Cache-Control "max-age=604800, public" </filesMatch> # 2 дня <filesMatch "\.(xml|txt)$"> Header set Cache-Control "max-age=172800, public, must-revalidate" </filesMatch> # 1 час <filesMatch "\.(html|htm|php)$"> Header set Cache-Control "max-age=3600, private, must-revalidate" </filesMatch> </ifModule>
Заметим, что теперь файлы изображений будут кэшироваться на всех публичных кэш-уровнях в течение 1 месяца. Файлы каскадных таблиц и javascript-кода могут изменяться чаще, чем изображения, поэтому срок нахождения их в кэше поменьше, и т.д. Кстати, private никоим образом не означает конфиденциальность контента, этот ключ лишь говорит каким образом будет кэшироваться объект.
ETagОбъектные теги или entity tags (ETag) представляют собой механизм проверки на наличие новой версии кэшированного файла. Так вот, удаляя заголовок ETag, вы говорите кэширующим серверам и браузеру, чтобы они не проверяли наличие новых версий кэшированных файлов, т.е. они должны полагаться только на заголовки Cache-Control и Expires. Однако не рекомендуется отключать ETag для html-страниц. Ниже приведены строки, которые нужно добавить в .htaccess:
<ifModule mod_headers.c> <filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header unset ETag FileETag None </filesMatch> </ifModule>
Last-ModifiedВ дополнение ко всему выше упомянутому вы можете удалить запросы If-Modified-Since и If-None-Match, а также ответы на них 304 Not Modified. Сделать это можно удалением заголовка Last-Modified, чтобы проверка на измененное содержание не осуществлялась до тех пор пока об этом не объявит заголовок Expires. Добавляем строки:
<ifModule mod_headers.c> Header unset Last-Modified </ifModule>
Внеся все эти изменения в файл .htaccess скорость загрузки вашего блога увеличится, а трафик уменьшится.
Распечатать статью
16 Responses
Евгений
Январь 21st, 2009 at 18:04
1Большое спасибо за статья, все кратко, понятно и полезно
Darkover
Январь 21st, 2009 at 23:14
2Спасибо! Отличное описание, а то я обычно плагинами самого wp все кеширую, но на серверном уровне это будет более эффективно
Алекс
Январь 22nd, 2009 at 00:30
3Thanks! Очень актуально, особенно для WordPress. Проверил, все сразу заработало!
Оценить бы в цифрах скорости загрузки блога на реальном трафике …
Новости 2.0
Январь 22nd, 2009 at 13:34
4Обсудите эту новость на news2.ru…
…
Сергей Цепелев
Январь 22nd, 2009 at 15:08
5Спасибо большое за статью.
А на уровне сервера будет работать если прописать данные параметры в httpd.conf?
Bambino
Январь 22nd, 2009 at 15:41
6Естественно, это же все серверные переменные. И функция самого .htaccess есть твик конфигурационного файла веб-сервера.
Алекс
Январь 22nd, 2009 at 21:53
7Потестил с помощью сервиса http://tools.pingdom.com/fpt/. Наблюдал увеличение скорости загрузки блога на 20-30%, как при включенном кэшировании, так и без него.
SamNitro
Январь 23rd, 2009 at 03:20
8Да статья полезная. Сделал у себя, стал работать быстрее
Поваренная книги поисковой оптимизации
Февраль 2nd, 2009 at 15:44
9Еще немного о загрузке сайта и об экономии трафика
Недавно я публиковал статью о том как повысить скорость загрузки вашего сайта и сэкномить на трафике. Принцип работы основывался на сжатии и кэшировании содержимого вашего сайта с помощью веб-сервера Apache и конфигурационного файла .htaccess.
Перспективный блоггер
Май 6th, 2009 at 20:55
10Отличная статья, скорей всего тоже ускорю так свой ВП.
Но для сайтов, которые продают ссылки, например, с Сапы, большинство из этих приемов будут только вредны, т.к. страницы с ссылками, исправленными после эрроров, могут отдаваться боту Сапы в старом варианте. Здесь риск будет стоить денег.
Bambino
Май 7th, 2009 at 17:01
11Ну… придется выбирать или шашечки, или ехать
Да и зачем на хороших блогах ссылки продавать?
Игорь
Октябрь 25th, 2009 at 02:02
12Здравствуйте, спасибо. На данный момент как раз тестирую со всеми настройками кеширования. Визуально сайт летает, после того, как один раз зашел, а вот на первый заход требуется много времени, пока сгенерит страницу, буду тестировать дальше, не пойму где все-таки искать…
dizelbox
Октябрь 25th, 2009 at 14:16
13Отличный пост. Благодаря тому, что я последовал этим советам, трафик уменьшился на 60%.
Bambino
Октябрь 28th, 2009 at 14:04
14Игорь, если честно, я не замечал больших временных затрат при первом заходе.
Игорь
Октябрь 28th, 2009 at 15:58
15Bambino, это вы зашли когда уже была закешированная страница, скорее всего, в исходном коде странице можно глянутьвремя генерации, совсем не радует, 8-33, установлен nginx, php-eaccelerator, вообщем как сделаю наилучший вариант отпишусь
Олег
Февраль 9th, 2010 at 14:28
16gzip & cache творит чудеса. Раньше при большом посещении MySQL занимал 100% процессора, сейчас 5-9%
RSS feed for comments on this post · TrackBack URI
Оставьте комментарий