CDN для сайта: настройка
Сайт открывается быстро у вас и медленно — у половины посетителей из других регионов, а на пиках трафика сервер начинает захлёбываться на отдаче обычных картинок. Обе проблемы решает CDN: статика раздаётся с серверов, географически близких к посетителю, а ваш VPS освобождается от рутинной работы и занимается только тем, что реально требует его вычислений. Разберём, как подключить CDN на практике — через Cloudflare как самый доступный и распространённый вариант, — что кешировать агрессивно, а что нельзя трогать, и почему скрытый за CDN IP сервера не спасает от прицельной атаки.
Содержание
Зачем сайту нужен CDN
CDN (Content Delivery Network, сеть доставки контента) — это распределённые по миру узлы, которые хранят копию вашей статики и отдают её посетителю с ближайшей точки, а не с единственного сервера на другом конце света. Если ваша аудитория сидит в одной стране рядом с сервером, эффект будет скромным. Но если посетители приходят из разных регионов, каждый лишний прыжок через полмира добавляет заметную задержку — CDN эту задержку убирает.
Второй эффект даже важнее первого: снятие нагрузки с origin-сервера. Каждая картинка, файл стилей или скрипт, отданный из кеша CDN, — это запрос, который никогда не дошёл до вашего VPS. Сервер продолжает обрабатывать динамику: генерацию страниц, запросы к базе, API — а всю рутинную раздачу файлов берёт на себя сеть доставки. На практике это означает, что один и тот же тариф VPS выдерживает заметно больший всплеск посетителей, если статика уже не идёт через него напрямую.
Третья причина — сглаживание пиков. Если на сайт неожиданно хлынул трафик (посты в соцсетях, рассылка, распродажа), CDN поглощает основную волну повторяющихся запросов к одним и тем же файлам, и сервер этого почти не замечает.
Cloudflare как самый доступный вариант
Для большинства сайтов проще всего подключить CDN через Cloudflare — у него есть бесплатный тариф, который закрывает базовые задачи: кеширование статики, HTTPS, базовая защита от ботов. Процесс подключения выглядит так.
- Зарегистрируйтесь на cloudflare.com и добавьте домен через кнопку «Add a site».
- Cloudflare просканирует текущие DNS-записи домена и покажет их список — проверьте, что все нужные записи (A, CNAME, MX и так далее) подхватились корректно, при необходимости добавьте недостающие вручную.
- Cloudflare выдаст пару NS-записей вида
ns1.cloudflare.comиns2.cloudflare.com(конкретные имена индивидуальны для каждого аккаунта). - Зайдите в панель управления доменом у вашего регистратора и замените текущие NS-записи на выданные Cloudflare.
- Дождитесь применения — обычно от нескольких минут до пары часов, иногда до суток из-за особенностей DNS-кеширования у разных провайдеров.
После смены NS домен официально управляется через Cloudflare, и именно там теперь настраиваются DNS-записи, включая проксирование. В интерфейсе DNS у каждой записи есть переключатель облака: серое облако — «DNS only», запрос идёт напрямую на ваш сервер, оранжевое облако — «Proxied», трафик идёт через сеть Cloudflare, и только тогда включаются CDN, кеширование и защита. Для сайта нужно включить проксирование (оранжевое облако) на записи, которая указывает на веб-сервер; записи вроде MX для почты обычно оставляют серыми — прокси Cloudflare предназначен для веб-трафика, а не для почтового.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать VPSЧто кешировать агрессивно, а что нет
Главная ошибка при подключении CDN — единое правило кеширования для всего сайта. Правильный подход — разделить контент на два лагеря.
Кешировать агрессивно и надолго:
- изображения (jpg, png, webp, svg, gif);
- CSS и JS файлы, особенно если у них в имени есть хеш версии;
- шрифты (woff, woff2, ttf);
- статичные документы для скачивания (pdf, zip и подобные).
Эти файлы не меняются от запроса к запросу и одинаковы для всех посетителей — идеальный материал для кеша с большим временем жизни. На вашем сервере это задаётся заголовками ответа:
location ~* \.(jpg|jpeg|png|webp|gif|svg|css|js|woff2?|ttf)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000, immutable";
}
Не кешировать или кешировать с оговорками:
- динамические ответы API (данные пользователя, корзина, статусы заказов);
- страницы с персонализированным содержимым (личный кабинет, авторизация);
- формы с CSRF-токенами — закешированный токен может не совпасть с сессией следующего посетителя.
Для такого контента отдавайте заголовок Cache-Control: no-store или private, чтобы CDN не сохранял ответ и не показал данные одного пользователя другому:
location /api/ {
add_header Cache-Control "no-store";
}
Между этими двумя крайностями лежит HTML самих страниц. Если сайт в основном статичный (блог, лендинг, документация), HTML тоже можно кешировать — но на короткое время (минуты, а не дни), чтобы обновления публикаций доходили до посетителей достаточно быстро без ручного сброса кеша на каждую правку.
Настройка кеша в Cloudflare
По умолчанию Cloudflare кеширует по расширению файла на основе собственного списка (изображения, стили, скрипты кешируются, HTML — нет). Этого достаточно для старта, но для контроля стоит настроить Cache Rules (в панели: раздел Caching → Cache Rules — этот интерфейс в 2026 году заменил более старые Page Rules у большинства аккаунтов).
Типовое правило для статики в отдельной папке:
- Условие: URI Path содержит
/static/или/assets/ - Действие: Cache Eligibility — Eligible for cache, Edge TTL — задать вручную, например 7 дней
Типовое правило, чтобы явно исключить динамику из кеша:
- Условие: URI Path содержит
/api/или/cart/ - Действие: Cache Eligibility — Bypass cache
Отдельно обратите внимание на Browser Cache TTL — это время, на которое браузер посетителя закешируется сам, отдельно от кеша на узлах Cloudflare. Для статики с версионированием в имени файла (style.a1b2c3.css) его можно ставить в максимум — новая версия файла всё равно придёт под новым именем.
Сброс кеша после обновления сайта
Рано или поздно возникает ситуация: вы обновили картинку или файл стилей, а посетители всё ещё видят старую версию — CDN честно отдаёт то, что закешировал раньше. Есть два рабочих подхода.
Первый и самый надёжный — версионирование имён файлов. Каждое изменение файла сопровождается изменением его имени или добавлением хеша (app.js?v=42 или app.a1b2c3.js). Тогда новая версия — это физически новый URL, и старый кеш просто не мешает, сбрасывать вручную ничего не нужно. Это стандартная практика для собранного фронтенда (webpack, vite и подобные сборщики делают это автоматически).
Второй — ручной сброс кеша (purge) в панели Cloudflare: Caching → Configuration → Purge Cache. Есть вариант «Purge Everything» (сбросить весь кеш домена — самый простой, но и самый грубый способ) и точечный сброс по конкретным URL, если нужно обновить только несколько файлов, не трогая остальной кеш. То же самое можно сделать через API одним запросом, что удобно встроить в скрипт деплоя, чтобы сброс кеша происходил автоматически при каждом обновлении сайта:
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" \
-H "Authorization: Bearer API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
Для сайтов с частыми обновлениями разумно сочетать оба подхода: версионировать статику, чтобы кеш не мешал в обычной работе, а purge использовать как аварийный рычаг, если что-то закешировалось неправильно или нужно сбросить всё разом.
Что CDN маскирует, а что нет
После включения проксирования запросы к вашему серверу идут не напрямую от посетителей, а с узлов Cloudflare — и это меняет то, что видно снаружи. Если раньше кто угодно мог узнать IP вашего сервера, просто посмотрев на DNS-запись домена, то теперь публично виден только адрес Cloudflare, а не origin-сервера. Это удобно: часть автоматических сканеров и простых DDoS-атак, которые целятся по домену, бьют по инфраструктуре Cloudflare, а не по вашему VPS напрямую.
Но важно понимать границу этой защиты. Маскировка работает только пока настоящий IP сервера действительно неизвестен атакующему. А узнать его можно разными путями, не связанными с DNS-записью домена: старые записи, которые индексировались до подключения CDN и остались в истории (например, в сервисах вроде SecurityTrails); поддомены, которые забыли включить в проксирование и они по-прежнему указывают на сервер напрямую; заголовки писем, если на том же сервере стоит почта; баннеры сервисов, которые видны сканерам вроде Shodan, если порты открыты всему интернету. Если IP уже известен, атакующий бьёт напрямую в обход CDN, и никакая маскировка не помогает — сработает только реальная защита самого сервера.
Поэтому маскировку IP правильно рассматривать как один из слоёв защиты, а не как единственный. Дополните её: закройте на фаерволе сервера прямой доступ по HTTP/HTTPS для всех, кроме IP-диапазонов Cloudflare (актуальный список публикуется на cloudflare.com/ips), смените поддомены, если по старым записям сервер отвечает напрямую, и отключите баннеры сервисов там, где это возможно. Подробно о том, как встраивается сеть доставки контента перед сервером и что при этом настраивается на стороне VPS, разобрано в статье про настройку CDN перед сервером. Если же атака всё-таки застала сервер врасплох, порядок первых действий описан в статье про DDoS-атаку.
Отдельно стоит настроить восстановление реального IP посетителя на стороне вашего веб-сервера — иначе в логах вместо адресов пользователей будут адреса узлов Cloudflare, и любая логика, завязанная на IP (геоблокировки, бан за брутфорс, аналитика), сломается. Cloudflare передаёт настоящий адрес посетителя в заголовке CF-Connecting-IP, и Nginx нужно явно научить его читать:
set_real_ip_from 0.0.0.0/0;
real_ip_header CF-Connecting-IP;
(в проде вместо 0.0.0.0/0 лучше явно перечислить диапазоны Cloudflare из их официального списка, а не доверять заголовку от произвольного источника).
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать VPSНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
CDN нужен маленькому локальному сайту?
Не особенно. Основной эффект — близость точки раздачи к посетителю и снятие нагрузки с сервера. Если аудитория небольшая и вся в одном регионе с сервером, выгода будет скромной, и сначала стоит оптимизировать сам сервер.
Cloudflare бесплатный тариф чего-то не умеет?
Бесплатный план закрывает базовые задачи: CDN, HTTPS, базовое кеширование и защиту от простых атак. Платные тарифы добавляют более тонкие правила кеша, расширенный WAF и приоритетную поддержку — для старта хватает бесплатного.
После подключения сайт стал показывать ошибку сертификата?
Обычно причина в режиме SSL в Cloudflare (раздел SSL/TLS). Если на сервере уже есть валидный сертификат, выбирайте режим Full (Strict); режим Flexible уместен только как временное решение, если на origin ещё нет HTTPS.
Как проверить, что проксирование реально работает?
Посмотрите заголовки ответа сайта — при включённом Cloudflare там появляется заголовок cf-ray. Его отсутствие означает, что запрос идёт напрямую на сервер, минуя сеть доставки.
Можно ли использовать CDN не от Cloudflare?
Да, есть и другие варианты, но Cloudflare остаётся самым доступным по входу — не требует смены хостинга статики и работает поверх любого VPS через простую смену NS-записей домена.