Сегодня я расскажу о кэшировании в Nginx — одном из самых эффективных способов ускорить работу сайта и снизить нагрузку на сервер. Ты узнаешь, как заставить Nginx работать ещё быстрее, делая так, чтобы он запоминал и возвращал пользователям ранее сгенерированные данные.
Что такое кэширование
Кэширование — это процесс сохранения данных, чтобы в следующий раз отдавать их быстрее. Вместо того чтобы каждый раз генерировать страницы или обрабатывать запросы, сервер может просто вернуть «заготовку».
Почему это важно?
- Скорость. Запросы обрабатываются быстрее.
- Снижение нагрузки. Бекенд освобождается от лишней работы.
- Экономия ресурсов. Сервера выдерживают больше посетителей.
Виды кэширования в Nginx
Nginx может работать с кэшем по-разному:
- Кэширование статического контента: Например, CSS, JS, изображения и другие файлы, которые редко меняются.
- Кэширование проксируемых запросов: Это сохранение ответов от бекенда для повторной выдачи.
Сегодня мы настроим оба вида.
Шаг 1: Кэшируем статический контент
Статические файлы (например, картинки и стили) идеально подходят для кэширования. Они не меняются при каждом запросе, а значит, их можно отдавать из кэша без перерасчётов.
Настраиваем в конфигурации Nginx
server {
listen 80;
server_name mysite.local;
location /static/ {
root /var/www/mysite;
expires 30d;
access_log off;
add_header Cache-Control "public, max-age=2592000";
}
location / {
proxy_pass http://backend;
}
}
Что здесь происходит?
- expires 30d: файлы кэшируются на 30 дней.
- add_header Cache-Control: добавляет заголовки, которые заставляют браузеры кэшировать файлы.
Теперь, когда пользователь загружает CSS или JS, браузер сохраняет их локально. Это сокращает количество запросов к серверу.
Шаг 2: Кэшируем ответы от бекенда
Теперь давай настроим кэширование динамического контента. Представь, что твой бекенд генерирует одинаковые страницы для всех пользователей — это отличный случай для проксируемого кэша.
Включаем прокси-кэш
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=backend_cache:10m max_size=100m inactive=60m use_temp_path=off;
server {
listen 80;
server_name mysite.local;
location / {
proxy_cache backend_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_key $scheme$proxy_host$request_uri;
proxy_pass http://backend;
add_header X-Cache-Status $upstream_cache_status;
}
}
Разбор кода
- proxy_cache_path levels=1:2: структура директорий для хранения кэша.
- keys_zone=backend_cache:10m: выделяем 10 МБ для хранения ключей кэша.
- max_size=100m: общий размер кэша — 100 МБ.
- inactive=60m: неиспользуемые данные удаляются через 60 минут.
- proxy_cache: Активирует кэш для указанной зоны.
- proxy_cache_valid: Устанавливает время жизни кэша для разных типов ответов (например, 200, 404).
- add_header X-Cache-Status: Добавляет заголовок X-Cache-Status, чтобы отслеживать, откуда взялся ответ (из кэша или от бекенда).
Проверяем работу кэша
Перезапусти Nginx:
sudo systemctl reload nginx
Открой сайт и проверь заголовки ответа с помощью браузера или команды curl:
curl -I http://mysite.local
Ты увидишь заголовок X-Cache-Status со значением:
- MISS: ответа в кэше не было, запрос ушёл на бекенд.
- HIT: ответ взят из кэша.
Шаг 3: Исключения для кэша
Иногда кэшировать данные не нужно, например, для страниц с динамическим содержимым (личные кабинеты, корзины покупок).
Добавь исключение:
location /user/ {
proxy_pass http://backend;
proxy_no_cache $cookie_session;
proxy_cache_bypass $cookie_session;
}
Здесь:
- proxy_no_cache: не сохраняет данные в кэш.
- proxy_cache_bypass: обходит кэш для запросов с определённым параметром.
Теперь страницы с пользовательскими данными не будут кэшироваться.
Шаг 4: Очищаем кэш
Иногда кэшированные данные устаревают, и их нужно удалить. Для этого можно использовать специальный ключ или вручную очищать файлы в директории кэша:
sudo rm -rf /var/cache/nginx/*
Шаг 5: Советы по оптимизации
Устанавливай разумные сроки кэширования: Для статических файлов — 30 дней и более. Для динамического контента — от 5 до 30 минут.
Используй условное кэширование: Например, кэшируй только GET-запросы, игнорируя POST:
if ($request_method = POST) {
set $skip_cache 1;
}
Отслеживай размер кэша: Регулярно проверяй, сколько места занимает кэш:
du -sh /var/cache/nginx/
Логи кэширования: Включи логирование, чтобы видеть, как работает кэш:
log_format cache_status '$remote_addr - $upstream_cache_status';
access_log /var/log/nginx/cache.log cache_status;
Задание для самостоятельной практики
- Настрой кэширование статических файлов на своём сервере.
- Включи прокси-кэш для динамического контента.
- Проверь, работает ли кэш с помощью заголовка X-Cache-Status.
- Настрой исключения для страниц с пользовательскими данными.
Кэширование в Nginx — это мощный инструмент, который может ускорить твой сайт и значительно снизить нагрузку на сервер. Теперь ты знаешь, как настроить и использовать его в своих проектах. В следующей статье мы погрузимся в защиту сайта с помощью Nginx: баны, ограничения и другие хитрости. До встречи!