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

Як за допомогою кешування знизити час завантаження сайту та навантаження на веб-сервер

        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 секунд.

На цьому зображенні видно, як браузер відправляє запит на отримання файлу - 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). Якщо файл змінити хоч в одному байті, значення ETag для нього також зміниться.

На малюнку вище видно, як браузер говорить веб-серверу: "Прийшли мені /file повторно, якщо його ETag не дорівнює x234dff". На що сервер відповів: "/file не змінювався, можеш використовувати кеш протягом наступних 120 секунд". І так далі. Якби файл змінився, веб-сервер відправив би відповідь повністю, включаючи модифікований файл.

   Налаштування кешування в 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 року.

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