Сегодня я расскажу о кэшировании в 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: баны, ограничения и другие хитрости. До встречи!