Способы оплаты Abuse

Как ускорить сайт с помощью кеширования в Nginx

29.05.2025, 18:25

Сайт начал тормозить, едва вырос трафик? Такое случается часто: стоит запустить рекламу или попасть в новостные агрегаторы — и серверу уже не до шуток. Страницы открываются с задержками, появляются ошибки 502, а владелец проекта пытается понять, как выйти из ситуации. Один из самых простых и эффективных способов — включить кеширование в Nginx. Это разгрузит сервер и сделает сайт заметно быстрее.

Когда проект небольшой, Nginx спокойно справляется с задачами: отдаёт страницы, картинки, скрипты. Но как только трафик вырастает, каждый лишний запрос становится испытанием. Тут-то и приходит на выручку кеш: он позволяет сохранять и повторно использовать уже обработанные данные — и экономит ресурсы.

Что даёт кеширование

Скорость важна всем: пользователю — чтобы не ждать, поисковику — чтобы продвинуть быстрее сайт, владельцу — чтобы не терять клиентов. Кеширование даёт сайту фору: оно сохраняет обработанные файлы и страницы, чтобы не собирать их заново при каждом запросе. Это особенно полезно при высокой нагрузке.

Пример: пользователь заходит на сайт и загружает баннер весом в мегабайт. Без кеша он — и другие посетители — будут скачивать этот баннер каждый раз. А с кешем он сохранится и будет отдаваться мгновенно. Если таких изображений сотни, экономия ресурсов становится ощутимой.

Ещё мощнее эффект, если Nginx используется как промежуточный слой между пользователем и бэкендом. Он может сохранить результат работы серверной части и отдавать его другим посетителям, не нагружая ядро сайта. Это особенно актуально при пиковых нагрузках, когда каждая миллисекунда важна.

Но важно помнить: кеш — это не просто «включил и забыл». Неправильная настройка может, наоборот, навредить. Например, если кешировать страницу с динамическими данными (профиль, корзина) — пользователь получит чужую или устаревшую информацию. Поэтому подходить к настройке нужно аккуратно.

Как кешировать статические файлы в Nginx

На современных сайтах до 80% трафика приходится на изображения, скрипты, стили и шрифты. Всё это — статический контент, который отлично поддается кешированию. Чтобы браузер не запрашивал их заново, достаточно задать в Nginx срок хранения:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2?|ttf|svg)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000";
}

Этот фрагмент говорит браузеру: «Храни файл 30 дней, можешь не лезть за ним снова». Это ускоряет сайт и снижает нагрузку на сервер.
Чтобы пользователь всегда видел актуальную версию, принято добавлять к файлам версионирование — например, style.v3.css. Так браузер понимает, что это новая версия, и загружает её.

Часто крупные сайты выносят весь тяжёлый контент на отдельный поддомен вроде static.site.ru. Это удобно: основная часть сайта остаётся гибкой и легко обновляется, а статика — кэшируется надолго.

Что делать с динамическими страницами: proxy_cache

Самая большая нагрузка обычно не от картинок, а от страниц, генерируемых на лету: карточки товаров, статьи, профили. Здесь поможет proxy_cache — функция Nginx, позволяющая сохранять ответы от бэкенда.

Настройка начинается с определения места, где будут храниться файлы:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:100m max_size=10g inactive=60m use_temp_path=off;

Далее подключаем кеш в нужном месте конфигурации:

location / {
    proxy_pass http://backend;
    proxy_cache my_cache;
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
    add_header X-Proxy-Cache $upstream_cache_status;
}

Что делает эта настройка:
→ сохраняет ответы на успешные запросы на 10 минут;
→ кеширует 404-страницы на 1 минуту;
→ показывает, откуда пришёл ответ — из кеша (HIT) или с бэкенда (MISS).

Важно: персональные страницы (корзина, аккаунт, заказы) кешировать нельзя — это может привести к утечке данных. Их нужно отдавать напрямую через бэкенд. В российских проектах часто делают разные правила для разных участков сайта.
Иногда Nginx ставят между CDN и бэкендом — это даёт ещё один буфер, позволяющий выдерживать десятки тысяч запросов в секунду.

Как проверить, работает ли кеш

Даже идеально прописанные конфиги не гарантируют, что всё работает. Часто бывает, что кеш не срабатывает — и сайт по-прежнему тормозит. Поэтому важно проверять.

Простейший способ — посмотреть заголовки ответа с помощью curl:

curl -I https://example.com/image.jpg

В ответе вы должны увидеть Cache-Control, Expires, а если используется proxy_cache — X-Proxy-Cache.

Пример ответа:

HTTP/2 200
Cache-Control: public, max-age=2592000
Expires: Mon, 12 Jun 2025 10:00:00 GMT
X-Proxy-Cache: HIT

Если вместо HIT вы видите MISS — это значит, что файл загружается напрямую. Причин может быть несколько — например, бэкенд сам запрещает кеширование. Тогда используют директиву:

proxy_ignore_headers Cache-Control Pragma;

Этот трюк позволяет обойти ограничения и всё же кешировать то, что нужно.

Некоторые проекты автоматизируют очистку кеша через скрипты или API: при обновлении страницы старый кеш удаляется — и пользователи сразу видят свежую информацию.

Вывод

Быстрый сайт — это не только про удобство, но и про доверие. Он лучше ранжируется, даёт больше продаж и меньше раздражает пользователей. Кеширование — один из самых надёжных способов добиться стабильной скорости без лишних затрат.

Практика показывает: грамотно настроенный кеш экономит ресурсы и нервы, особенно в моменты, когда сайт под прицелом тысяч глаз. Лучше один раз всё продумать — и потом спокойно смотреть, как Nginx раздаёт страницы с молниеносной скоростью.