Статьи / Внутренняя оптимизация сайта /

Как при помощи кэширования снизить время загрузки сайта и нагрузку на веб-сервер

HTTP 1.1 кэширование. Настройка apache2

Ни для кого не секрет, что браузеры кэшируют на диске однажды загруженные изображения gif/jpeg/png, таблицы CSS, js-код, pdf, иными словами — статическое содержимое веб-сайта. Если пользователь запрашивает ресурс повторно, браузер отдаёт его из кэша. Кэширование позволяет снизить время отклика сайта и нагрузку на веб-сервер.

Рассмотрим более подробно как работает кэширование в протоколе HTTP 1.1 (версия 1.1 уже давно поддерживается всеми современными браузерами и веб-серверами).

На этом изображении видно, как браузер отправляет запрос на получение файла — GET /file, а веб-сервер отсылает ответ, в котором, кроме кода и тела ответа есть 2 важных для кэширования HTTP заголовка — Cache-Control и Etag.

Заголовок Cache-Control: max-age=120 разрешает браузеру сохранить ответ веб-сервера в кэше, который будет считаться действительным (valid) в течение 120 секунд.

Если пользователь попросит /file снова, то браузер вернёт ответ из кэша не обращаясь к веб-серверу — браузер возвращает ответ мгновенно.

Что произойдёт, когда запись в кэше станет недействительной(invalid), то есть по истечении 120 секунд?

Здесь в игру вступают HTTP заголовки ETag и If-None-Match. Веб-сервер вычисляет для каждого файла уникальный ETag маркер (в нашем случае x234dff для /file). Если file изменить хоть в одном байте, значение ETag для него также изменится.

На рисунке выше видно, как браузер говорит веб-серверу: «Пришли мне /file повторно, если его ETag не равен x234dff». На что сервер ответил: «/file не изменялся, можешь использовать кэш в течении следующих 120 секунд». И так далее. Если бы файл изменился, веб-сервер отправил бы ответ целиком, включая модифицированный file.

Настройка кэширования в Apache

Чтобы включить поддержку кэширования (заголовка Cache-Control) в Apache необходимы модули — mod_expires.so, mod_headers.so.

Debian 8:

  • a2enmod expires
  • a2enmod headers
  • apachectl -k restart

CentOS 7:

  • В файле /etc/httpd/conf.modules.d/00-base.conf раскомментируйте строки:
  • LoadModule expires_module modules/mod_expires.so
  • LoadModule headers_module modules/mod_headers.so
  • systemctl restart httpd.service

Чтобы браузеры кэшировали на 24 часа изображения, css, js, документы, архивы и прочее, добавьте в конфигурационный файл apache2.conf / httpd.conf:

Это всего лишь пример, Вам следует самостоятельно выбрать какие типы содержимого вашего сайта нужно кэшировать и на какой срок. Например, можно настроить кэширование изображений на пол года, а JavaScript код и CSS на 1 месяц. В любом случае W3C, не рекомендует устанавливать кэширование на срок более 1 года.

Антон Сыровацкий
Системный администратор дата центра ЮНИТ-ИС