ProfiPHPProfiPHP
Категория: Веб сервер

Кэшируем статические файлы в браузере

Для увеличения скорости загрузки сайта воспользуемся одним из распространенных методов - кэшированием загруженной информации. Кэширование реализуем с помощью модуля mod_expires. Тем самым сократим время загрузки страниц и уменьшим трафик, потребляемый нашим ресурсом.

Mod_expires - модуль Apache, который позволяет указывать HTTP-заголовки Expires, кэширующие статические файлы в браузере пользователя. Также это применимо к CSS, JavaScript и другим файлам. В результате работы модуля имеем снижение трафика и увеличения скорости отображения страниц.

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

Большинство веб-серверов позволяют установить заголовки ответов Expires с помощью ряда методов. Как правило, они позволяют установить абсолютно точное время окончания; время, на основе последнего раза, когда клиент спрашивал контент (last access time) или время, основанного на дате последнего изменения документа на сервере (last modification time).

Заголовки Expires особенно подходят для кэширования статических изображений (таких как навигация и кнопки). Потому что они не меняются часто и вы можете устанавливать им очень долгое время окончания, делая ваш сайт более чутким к пользователям.

Отметим, что только HTTP-дата является действительным значением HTTP-заголовка Expires. Другие значения, наиболее вероятно, будут интерпретированы как уже прошлое, так что контент не будет кэшироваться. Также, стоит напомнить, что время в HTTP-дате трактуется по Гринвичу (GMT), а не в соответствии с местным часовым поясом. К примеру:
Expires: Fri, 05 Jan 2018 13:13:27 GMT
Хотя заголовок Expires полезен, он имеет некоторые ограничения. Часы веб-сервера и кэша должны быть синхронизированы, так как в расчетах присутствует время; если у них разное представление о текущих дата/время, ожидаемый эффект не будет достигнут и кэш может ошибочно трактовать устаревший контент как свежий.

По умолчанию Apache собирается уже с поддержкой mod_expires. Например, в системе Debian или Ubuntu необходимо выполнить следующую команду:
sudo a2enmod expires
Результатом работы будет строка:
Enabling module expires.
To activate the new configuration, you need to run:
service apache2 restart
Следуйте инструкциям. Необходимо перезапустить Apache, чтобы включить модуль. Если он уже был включен, то вы увидите:
Module expires already enabled
Настройка mod_expires

Добавьте все необходимые правила в файл ".htaccess" в корневой директории сайта. Файл должен содержать следующую строку:
ExpiresActive On
И тогда необходимые правила. Чтобы настроить время хранения в кэше, добавьте строку с последующим видом:
ExpiresByType [mime type here] "access plus [number] [timeframe]"
В заголовках, полученных от сервера, существует валидатор Last-Modified, в котором отображается дата последнего изменения документа. Он очень важен, поскольку, если нет ни одного валидатора и не доступна любая информация о свежести (Expires или Cache-Control), кэш не будет хранить контент вообще.

Когда кэш хранит контент, содержащий заголовок Last-Modified, он (кэш) может использовать его для проверки изменения со времени его последнего посещения, с помощью If-Modified-Since запроса.

HTTP/1.1 ввел новый вид валидатора, названный Etag.
ETag: "977ef-3699-545599d8b300f"
ETag - это уникальный идентификатор, который генерируется сервером и изменяются каждый раз, когда запрашивается контент. Поскольку сервер управляет тем, как сгенерированный ETag, кэш может быть уверен в том, что, если ETag совпадает с результатами запроса If-None-Match, контент действительно совпадает.

Большинство современных веб-серверов могут автоматически генерировать и ETag, и Last-Modified заголовки, чтобы использовать в качестве валидаторов для статического контента, что в свою очередь означает, что вам не придется ничего делать.

Пример реализации кэширования в файле ".htaccess":
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access 7 days"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
ExpiresByType text/css "access plus 1 year"
ExpiresByType text/html "access plus 7 day"
ExpiresByType text/x-javascript "access 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/x-icon "access 1 year"
ExpiresByType application/x-shockwave-flash "access 1 year"
</IfModule>
"<IfModule ...> ... </IfModule>" - это своего рода контейнер, содержащий в себе директивы, предназначенные для того или иного модуля Apache и заодно проверяет его наличие. Если модуль не найден, то директивы игнорируются.

В данном случаи мы обращаемся к модулю mod_expires, исходный файл которого имеет название "mod_expires.c", где ".c" - расширение файла.

ExpiresActive - данная директива активирует или блокирует кэширование на стороне браузера пользователя (on - включить, off - блокировать).

ExpiresDefault - директива, которая способна ставить время хранении кэша в браузере по умолчанию. То есть, браузер будет кэшировать все подряд. В кавычках указывается временной интервал.

Время можно устанавливать в следующий вычислениях:

years - лет или year - один год

months - месяцев или month - один месяц

weeks - недели или week - одна неделя

days - дней или day - один день

hours - часов или hour час

minutes - минут minute - одну минуту

seconds - секунд

Перед временным интервалом прописываются дополнительные слова:

access - основное слово (основа). В переводе с англ. - Доступ;

plus - ключевое слово (ключ), после которого должно следовать числовое значение.

пример:
ExpiresByType image/jpeg "access plus 4 weeks"
ExpiresByType image/png "access plus 30 days"
Временной интервал и дополнительные слова обязательно содержатся в кавычках.

ExpiresByType - директива, которая задает временной интервал кэширования для определенных типов файлов. Преимуществом данной директивы является то, что она отменяет время кэша по умолчанию, для указанных типов файлов, установленного директивой ExpiresDefault.

Также обязательно через слэш указывается тип файлов, например: image/jpeg, text/html или application/x-javascript.

После данных настроек, ответ сервера примерно будет выглядеть так:
Date: Thu, 05 Jan 2017 14:47:55 GMT
Server: Apache/2.2.10 (Debian)
Last-Modified: Thu, 05 Jan 2017 14:47:48 GMT
ETag: "9fa80-70ec-54559fc2c2228"
Accept-Ranges: bytes
Content-Length: 28908
Cache-Control: max-age=31536000
Expires: Fri, 05 Jan 2018 14:47:55 GMT
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Content-Type: image/jpeg

Добавить комментарий

Имя:
Текст комментария: