Як налаштувати заголовки Cache-Control у NGINX

Як налаштувати заголовки Cache-Control у NGINX
Переклад 6 хв. читання
07 вересня 2023

Кешування - це процес зберігання завантажених даних для подальшого використання, коли вони можуть бути прочитані з диска замість того, щоб запитувати їх знову. Правильне використання кешування браузера та CDN може значно пришвидшити роботу вашого сайту.

Як працює кешування?

Браузер кожного користувача має вбудований кеш, який зберігає завантажені з веб-сайтів статичні об'єкти. При наступному підключенні, якщо об'єкт, який вони запитують, все ще знаходиться в кеші, він завантажиться з пам'яті, а не буде запитуватися знову, що значно прискорює продуктивність і зменшує навантаження на ваш веб-сервер.

Браузер користувача - це кеш на стороні клієнта. Однак багато великих сайтів також використовують мережу доставки контенту, або CDN. CDN розташовується перед вашим веб-сервером і кешує ваші сторінки на стороні сервера, зазвичай на декількох периферійних серверах, розташованих по всьому світу. Це покращує час відгуку, продуктивність і значно зменшує навантаження на ваш веб-сервер.

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

Певні сторінки ніколи не повинні кешуватися. Все, що вимагає від користувача входу в систему, не повинно кешуватися CDN, інакше ви ризикуєте показати особисту інформацію одного користувача іншим. Ви все ще можете кешувати такі сторінки лише на стороні браузера (встановивши Cache-Control на private ). Як правило, якщо сторінка має бути однаковою для всіх користувачів, наприклад, ваша домашня сторінка, ви можете її кешувати. Статичні ресурси, такі як CSS і зображення, зазвичай можна кешувати, часто набагато довше.

Вам також потрібно переконатися, що ви встановили розумний час життя (Time-To-Live, TTL) для кожного ресурсу. TTL контролює, як довго об'єкт буде залишатися в кеші, перш ніж стане недійсним, що змусить користувача запросити новий об'єкт. Компроміс тут полягає у виборі між тривалим часом кешування та швидким оновленням. Ви ж не хочете кешувати свою домашню сторінку на цілий рік, тому що у вівторок ви можете щось змінити. Встановлення максимального віку для домашньої сторінки в кілька хвилин є достатньо довгим, щоб покрити невеликі перезавантаження, і достатньо швидким, щоб забезпечити швидке розповсюдження оновлень. Однак для статичних ресурсів, таких як зображення, вони можуть ніколи не змінюватися, і ви можете встановити високі значення TTL, навіть два роки.

Ви завжди можете використовувати імена файлів з версіями, щоб викликати перезавантаження кешу. Якщо ви випускаєте нову версію таблиці стилів CSS, ви можете назвати її styles-1.0.1.css і браузер користувача (і будь-який CDN перед ним) побачить його як новий файл, який потрібно перезавантажити. Крім того, для деяких CDN ви можете вручну видавати валідації, щоб очистити наявний кеш, не змінюючи імен файлів.

Як використовувати Cache-Control в NGINX

Cache-Control має декілька варіантів:

  • public - може кешуватися будь-ким, включно з браузерами та CDN. Використовуйте його для більшості статичних об'єктів.
  • private - Містить конфіденційні дані, які не можуть кешуватися CDN або зворотними проксі-серверами. Браузер користувача може кешувати їх локально. Використовуйте цей параметр для більшості сторінок з автентифікацією
  • no-cache - Незважаючи на назву, він не вимикає кешування. Браузер все ще може кешувати відповідь для підвищення продуктивності, але перед використанням цього параметра він повинен перевірити наявність оновлень на сервері-джерелі. Використовуйте цей параметр, якщо ви хочете, щоб користувач щоразу перевіряв валідність кешу.
  • no-store - Повністю вимикає кешування. Використовуйте цей параметр лише для дуже важливих даних, які не можна надсилати двічі.

Коли ви встановлюєте максимальний вік, це завжди робиться в секундах. Однак, NGINX дозволяє використовувати ще декілька користувацьких значень:

  • -1 або off що вимкне кешування і не змінюватиме наявні заголовки
  • epoch - дорівнює нульовому часу Unix, це явно вимкне кешування та очистить усі кеші (корисно, якщо ви використовуєте NGINX як зворотний проксі-сервер).
  • max - термін дії якого закінчиться з кінцем всесвіту, 31 грудня 2037 року.
  • 30s, для секунд
  • 1m, для хвилин
  • 24h, для годин
  • 3d, за дні
  • 1M, для місяців
  • 2y, для років

Крім того, ви можете додати директиву no-transform, яка відключає будь-які можливі трансформації, які можуть бути виконані з ресурсом. Наприклад, деякі CDN стискають зображення для зменшення пропускної здатності. Ця директива вимикає таку поведінку.

У NGINX ви можете змінити заголовки Cache-Control за допомогою наступних директив:

expires 1y;

add_header Cache-Control "public, no-transform";

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

location ~* .(?:css|js)$ {
	expires 1y;
	add_header Cache-Control "public";
}

У цьому блоці location використовується регулярний вираз, який позначається символом ~. Це корисно для застосування загальних налаштувань для типу контенту. Якщо ви хочете зробити винятки для певних локацій, ви можете використати звичайний блок локацій, який матиме пріоритет над реґекс-співпадінням.

location /profile {
	expires 2d;
	add_header Cache-Control "public, no-transform";
}

Ви також можете використовувати модифікатор =, який точно збігається зі шляхами та має пріоритет над регекс-співпаданням і стандартним блоком розташування.

Використання Surrogate-Control для зміни поведінки CDN

Хоча ви можете вимкнути кешування CDN і використовувати кешування браузера за допомогою Cache-Control: private, краще контролювати його напряму. Більшість CDN підтримують заголовок Surrogate-Control, який працює точно так само, як і Cache-Control, але призначений лише для CDN. Таким чином, ви можете сказати Fastly робити одне, а користувачеві - інше.

У NGINX вам доведеться встановити цей заголовок вручну і вказати значення max-age замість того, щоб використовувати директиву expires.

add_header Surrogate-Control "public, max-age=86400";
add_header Cache-Control "public, max-age=120";

Вам неодмінно захочеться протестувати свій CDN, щоб переконатися, що це працює... Surrogate-Control досить нова функція, і вона не універсальна.

Джерело: How to Configure Cache-Control Headers in NGINX
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація