opened image

Мікрокешування nginx+apache та нюанси конфігурації

У цій статті ми обговоримо мікрокешування: навіщо воно потрібне, як його налаштувати і які підводні камені можуть зустрітися на шляху.

 

 

Що таке мікрокешування?

 

Мікрокешування — це тип кешу, який повністю створює файли сторінок і дозволяє замість запиту до бекенд-сервера видавати вже готову сторінку.

Основний мінус такого кешування, звичайно ж, те, що сторінки оновлюються дуже рідко. Але які ж тоді плюси від такого кешування?

Давайте візьмемо ситуацію зі слабким сервером і досить швидким сайтом, але на нього надходить велика кількість запитів від ботів. Вони будуть навантажувати як бекенд, так і базу даних, що призведе до падіння продуктивності сайту, і він буде завантажуватися повільніше. Тут на допомогу приходить мікрокешування: ми просто видаємо вже готові сторінки, не навантажуючи ні бекенд, ні сервер бази даних. Також мікрокешування дозволяє завантажувати сторінки в рази швидше за рахунок того, що не потрібно при кожному запиті чекати відповіді від бекенда.

Такий кеш не підійде для динамічних сайтів і сторінок адмін панелі, але якщо у вас є сторінка, яку оновлюєте, наприклад, раз на день, то це відмінний варіант.

Тепер можна перейти до налаштування мікрокешування.

 

Налаштування мікрокешування

 

Для цього нам потрібна директорія, де буде зберігатися наш кеш.

В даній статті буде використовуватися частина ОЗУ як місце на диску, так як це більш ефективно, ніж зберігати такі файли на диску.

Спочатку створимо директорію, де буде зберігатися наш кеш, в нашому випадку /home/cache:

 

 

mkdir /home/cache

 

 

Примонтуємо 1 ГБ ОЗУ як місце під файли за допомогою команди:

 

 

mount -t tmpfs -o size=1G tmpfs  /home/cache

 

І додамо монтування даного простору при кожному запуску сервера (потрібно додати цю строку в файл /etc/fstab):

 

 

tmpfs /home/cache tmpfs rw,size=1G 0 0

 

Також встановлюємо безпечні права для директорії:

 
chown www-data:www-data -R /home/cache
chmod 700 /home/cache

Мікрокешування nginx+apache і нюанси конфігурації - 2

 

Готово, ми підготували місце під кеш. Плюсом даного рішення є те, що при перезапуску сервера весь кеш очищається.

Зараз ми займемося потенційними підводними каменями, які можуть заважати роботі з кешем, і через які він не буде працювати, навіть якщо файли кешу будуть створюватися. Перше, що потрібно зробити — налаштувати в PHP параметр session.cache_limiter на public, інакше в заголовку сайту буде вказано Pragma: no-cache, що не дасть нам використовувати і створювати кеш коректно.

 

Мікрокешування nginx+apache і нюанси конфігурації - 3

Другий підводний камінь — потрібно додати строку в файл .htaccess вашого сайту. Рекомендую встановлювати max-age так само, як і інший кеш, щоб кеш не застарів:

 

 
Header set Cache-Control "max-age=300, public"

Мікрокешування nginx+apache і нюанси конфігурації - 4

 

Тепер ми можемо бути впевнені, що майже нічого не завадить нам використовувати кеш. Найважливіше залишу наприкінці, а саме налаштування Nginx.

В файлі /etc/nginx/nginx.conf потрібно в секцію http додати наступні строки:

 

 
proxy_cache_path /home/cache levels=1:2 keys_zone=global_cache:100m max_size=1g inactive=5m;
proxy_cache_valid any 5m;
proxy_cache_valid 200 5m;
proxy_cache_valid 404 15s;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_503;
proxy_cache_lock on;

Мікрокешування nginx+apache і нюанси конфігурації - 5

 

В файл конфігурації самого сайту в блок location / потрібно додати наступні строки: 

 

location / {
proxy_cache global_cache;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_key $host$request_uri;
proxy_ignore_headers "Set-Cookie";
proxy_pass http://backend;
}

Мікрокешування nginx+apache і нюанси конфігурації - 6

 

Для ISPManager ці дані строки потрібно додавати в блок location @fallback, так як всі запити на бекенд йдуть через цей блок.

А тепер поясню, за що відповідає кожна строка, яку ми додали в конфігурації:

  • proxy_cache_path /home/cache levels=1:2 keys_zone=global_cache:100m max_size=1g inactive=5m;

    • proxy_cache_path — шлях, де буде лежати кеш.
    • levels=1:2 — можна використовувати не більше 3 вкладень (наприклад, 1:2:3). Цифри відповідають за кількість символів у назві директорій кешу, що потрібно для швидкої роботи на повільних дисках. Якщо використовувати тільки levels=1, на повільних дисках толку від кешу буде мало, так як буде створюватися велика кількість файлів. Рекомендую використовувати вже готову настройку.
    • keys_zone=global_cache:100m — назва зони, до якої будуть звертатися наші сайти. Якщо кеш налаштований на зону global_cache, він буде шукати файли саме в директорії /home/cache. 100m — розмір зони імен для кешу.
    • max_size=1g — загальний розмір кешу.
    • inactive=5m — час, протягом якого кеш вважається активним. Якщо до кешу не звертаються протягом цього часу, система вважає його неактивним і може видалити.
  • proxy_cache_valid any 5m; — час, протягом якого буде зберігатися кеш. any означає, що всі HTTP-коди, крім окремо вказаних, будуть зберігатися 5 хвилин.

  • proxy_cache_use_stale error timeout invalid_header updating http_500 http_503; — дозволяє використовувати застарілий кеш при помилках, вказаних у строкі.

  • proxy_cache_lock on; — не дає створювати однакові кеші від кількох запитів одночасно.

  • proxy_cache global_cache; — вказує, яку зону кешу буде використовувати сайт.

  • proxy_cache_key $host$request_uri; — перевірка статусу кешу. Якщо в заголовку буде X-Cache-Status: HIT, то все правильно налаштовано. Якщо MISS, то потрібно шукати причини.

  • proxy_ignore_headers "Set-Cookie"; — дозволяє створювати запит, ігноруючи куки. Без цього кеш не буде показувати HIT, так як кожен запит буде унікальним.

  • proxy_pass http://backend; — тут потрібно вказати IP і порт бекенд-сервера (наприклад, localhost:8080, якщо використовується Apache2 в якості бекенд-сервера).

Перевірити статус кешу можна командою:

 
curl -I http://Ваш_сайт

​​​​​​​Мікрокешування nginx+apache і нюанси конфігурації - 7

 

В відповіді буде заголовок X-Cache-Status: HIT (або MISS, BYPASS). Все, що не HIT, — це помилка.

Готово. Ми налаштували мікрокешування на сайті.

*Сайт articlesite.com створений спеціально для статті.

 

Також пропонуємо розглянути інші корисні статті: