В этой статье мы обсудим микрокеширование: зачем оно нужно, как его настроить и какие подводные камни могут встретиться на пути.
Что такое микрокеширование?
Микрокеширование — это тип кеша, который полностью создает файлы страниц и позволяет вместо запроса к бэкенд-серверу выдавать уже готовую страницу.
Основной минус такого кеширования, конечно же, то, что страницы обновляются очень редко. Но каковы же тогда плюсы от такого кеширования?
Давайте возьмём ситуацию со слабым сервером и достаточно быстрым сайтом, но на него поступает большое количество запросов от ботов. Они будут нагружать как бэкенд, так и базу данных, что приведёт к падению производительности сайта, и он будет загружаться медленнее. Здесь на помощь приходит микрокеширование: мы просто выдаём уже готовые страницы, не нагружая ни бэкенд, ни сервер базы данных. Также микрокеширование позволяет загружать страницы в разы быстрее за счёт того, что не нужно при каждом запросе ждать ответ от бэкенда.
Такой кеш не подойдёт для динамических сайтов и страниц админ панели, но если у вас есть страница, которую обновляете, например, раз в день, то это отличный вариант.
Теперь можно перейти к настройке микрокеширования.
Настройка микрокеширования
Для этого нам нужна директория, где будет храниться наш кеш.
В данной статье будет использоваться часть ОЗУ как место на диске, так как это более эффективно, нежели хранить такие файлы на диске.
Сначала создадим директорию, где будет храниться наш кеш, в нашем случае /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
Готово, мы подготовили место под кеш. Плюсом данного решения является то, что при перезапуске сервера весь кеш очищается.
Сейчас мы займёмся потенциальными подводными камнями, которые могут помешать работе с кешем, и из-за которых он не будет работать, даже если файлы кеша будут создаваться. Первое, что нужно сделать — настроить в PHP параметр session.cache_limiter
на public
, иначе в заголовке сайта будет указано Pragma: no-cache
, что не даст нам использовать и создавать кеш корректно.
Второй подводный камень — нужно добавить строку в файл .htaccess
вашего сайта. Рекомендую устанавливать max-age
так же, как и остальной кеш, чтобы кеш не устаревал:
Header set Cache-Control "max-age=300, public"
Теперь мы можем быть уверены, что почти ничего не помешает нам использовать кеш. Самое важное оставлю напоследок, а именно настройка 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;
В файл конфигурации самого сайта в блок 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;
}
Для 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://Ваш_сайт
В ответе будет заголовок X-Cache-Status: HIT
(либо MISS
, BYPASS
). Всё, что не HIT
, — это ошибка.
Готово. Мы настроили микрокеширование на сайте.
*Сайт articlesite.com создан специально для статьи.
Также предлагаем рассмотреть другие полезные статьи:
- Как установить файловый менеджер FileGator на Centos 7. (Apache-Nginx)
- От нуля до героя: создание сервера LEMP на Rocky Linux 9
- Полезные лайфхаки для пользователей ispmanager