Как увеличить скорость загрузки сайта и уменьшить трафик
Я тут недавно потюнил .htacess
на предмет увеличения скорости загрузки блога. По-моему субъективному мнению скорость загрузки действительно возросла. Плюс дополнительные настройки работы с кэшем. Вообщем решил поделиться полезными алгоритмами.
Включаем компрессию
Как уже наверняка, многие знаю, последние версии практически всех Интернет-браузеров поддерживают возможность разархивировать контент, переданный веб-сервером в формете gzip, на лету. Можно воспользоваться этой фишкой и предварительно сжимать gzip’ом страницы блога перед отправкой их конечному посетителю . Для этого, правда, понадобится наличие подлкюченного Apache-модуля mod_gzip
. Если ваш хостер включил данный модуль по-умолчанию, то вы можете заставить его работать, добавив следущие строки к :
<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
необходимо добавить следующие строки в файл :
<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
, чтобы проверка на измененное содержание не осуществлялась до тех пор пока об этом не объявит . Добавляем строки:
<ifModule mod_headers.c> Header unset Last-Modified </ifModule>
Внеся все эти изменения в скорость загрузки вашего блога увеличится, а трафик уменьшится.