Як за допомогою кешування знизити час завантаження сайту та навантаження на веб-сервер
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 року.