Настройка Fastly CDN для высоконагруженных проектов
Отметим: когда ваш сайт начинает тормозить из-за резкого роста трафика, а инвалидация кеша занимает минуты, стандартные CDN перестают справляться. Мы часто видим проекты, где контент обновляется раз в несколько секунд, а кеш живёт час — в итоге пользователи видят устаревшие данные. Fastly решает эту проблему благодаря мгновенной инвалидации (< 150 мс по всей сети) и программируемой логике на edge через VCL и Compute@Edge. Это выбор для проектов, где нужен полный контроль над кэшированием и гибкость в настройке.
Мы используем Fastly для проектов с динамическим контентом: новостные порталы, интернет-магазины, SaaS-платформы. После настройки CDN HIT-ratio достигает 95%, что снижает нагрузку на бэкенд на 80%. Ниже разберём ключевые возможности и практические примеры настройки.
Почему Fastly лучше других CDN?
| Возможность | Fastly | Cloudflare | CloudFront |
|---|---|---|---|
| Инвалидация кеша | < 150 мс | 1–30 с | 1–5 мин |
| Программирование edge | VCL + WASM | Workers (JS) | Functions (JS) |
| Тег-инвалидация | Да (Surrogate-Key) | Нет | Нет |
| Real-time логи | Да | Да | Через S3 |
| Streaming | Отличное | Хорошее | Хорошее |
Fastly инвалидирует кеш в 10 раз быстрее CloudFront и в 20 раз быстрее Cloudflare. А тег-инвалидация Surrogate-Key позволяет сбрасывать кеш только для связанных страниц, не затрагивая весь сайт.
Как мы настраиваем Fastly CDN: этапы
Настройка проходит в несколько этапов:
- Аналитика — аудит текущей архитектуры, трафика и требований к кешированию.
- Проектирование — разработка VCL-логики: какие URL кешировать, какие пропускать, как обрабатывать Cookies.
- Реализация — развёртывание сервиса через Terraform или API, написание VCL-правил, настройка Surrogate-Key на backend.
- Тестирование — проверка инвалидации, производительности, корректности кеширования.
- Деплой — включение CDN на продакшене, мониторинг и оптимизация.
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика | 1–2 дня | Архитектурная схема, требования |
| Проектирование | 1 день | VCL-логика, схема инвалидации |
| Реализация | 1–2 дня | Рабочий сервис в Fastly |
| Тестирование | 1 день | Отчёт о производительности |
| Деплой | 0.5 дня | CDN включён на продакшене |
Как работает тегированная инвалидация (Surrogate-Key)?
Это главное преимущество Fastly. Вы можете присвоить каждой странице или объекту один или несколько тегов (ключей). При обновлении контента отправляете запрос на инвалидацию только по этим тегам — кеш очищается мгновенно без необходимости Purge All.
Пример на Laravel:
// Laravel: добавить Surrogate-Key заголовок в ответ
public function show(Product $product): Response
{
$response = response()->view('products.show', compact('product'));
// Теги для этой страницы
$surrogateKeys = [
"product:{$product->id}",
"category:{$product->category_id}",
"brand:{$product->brand_id}",
];
return $response->header(
'Surrogate-Key',
implode(' ', $surrogateKeys)
);
}
// При обновлении товара — инвалидировать только связанные страницы
class ProductObserver
{
public function saved(Product $product): void
{
Http::withHeaders([
'Fastly-Key' => config('services.fastly.api_key'),
])->post(
"https://api.fastly.com/service/{$serviceId}/purge/product:{$product->id}"
);
}
}
Детали реализации
Обратите внимание, что API-ключ Fastly должен храниться в безопасном хранилище. Рекомендуем использовать Laravel Vault или env-переменные.VCL — кастомная логика кеширования
Fastly выполняет VCL на каждом запросе. Это мощнее Workers для сетевых операций. Вот типовой набор правил, которые мы используем:
// Custom VCL: vcl_recv — обработка входящего запроса
sub vcl_recv {
// Убрать маркетинговые параметры из cache key
set req.url = regsubreplace(req.url,
"\?(.*&)?(utm_source|utm_medium|utm_campaign|fbclid|gclid)=[^&]*(&|$)",
"?"
);
set req.url = regsub(req.url, "\?$", "");
// Не кешировать авторизованных пользователей
if (req.http.Cookie ~ "laravel_session") {
return(pass);
}
// Не кешировать /admin/ и /api/
if (req.url ~ "^/(admin|area51|api)/") {
return(pass);
}
// Нормализация Accept-Encoding
if (req.http.Accept-Encoding ~ "br") {
set req.http.Accept-Encoding = "br";
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} else {
unset req.http.Accept-Encoding;
}
}
sub vcl_backend_response {
// Статические ассеты — год
if (bereq.url ~ "\.(js|css|woff2|webp|avif)$") {
set beresp.ttl = 365d;
set beresp.http.Cache-Control = "public, max-age=31536000, immutable";
}
// HTML-страницы — 5 минут
if (beresp.http.Content-Type ~ "text/html") {
set beresp.ttl = 5m;
set beresp.grace = 1h; // stale-while-revalidate
}
}
sub vcl_deliver {
// Отладочный заголовок
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache = "MISS";
}
}
Пояснение к VCL
Обратите внимание: в vcl_recv мы нормализуем Accept-Encoding, чтобы избежать дублирования кеша для разных кодировок. Это повышает HIT-ratio до 95%.Подключение через Terraform
Fastly управляется полностью через API или Terraform-провайдер. Ниже пример конфигурации с бэкендом, gzip и логированием:
terraform {
required_providers {
fastly = {
source = "fastly/fastly"
version = "~> 5.0"
}
}
}
resource "fastly_service_vcl" "main" {
name = "example-production"
domain {
name = "example.ru"
}
backend {
address = "origin.example.ru"
name = "origin"
port = 443
use_ssl = true
ssl_cert_hostname = "origin.example.ru"
ssl_sni_hostname = "origin.example.ru"
connect_timeout = 5000
between_bytes_timeout = 30000
first_byte_timeout = 30000
}
gzip {
name = "gzip-policy"
content_types = ["text/html", "text/css", "application/javascript", "application/json"]
extensions = ["css", "js", "html", "json"]
}
logging_s3 {
name = "s3-logs"
bucket_name = "fastly-logs"
path = "/cdn/%Y/%m/%d/"
period = 3600
format = "%h %l %u %t \"%r\" %>s %b"
s3_access_key = var.aws_access_key
s3_secret_key = var.aws_secret_key
}
logging_elasticsearch {
name = "elasticsearch-logs"
index = "fastly-%{now}V"
url = "https://es.example.ru:9200"
pipeline = "fastly-pipeline"
format = jsonencode({
timestamp = "%{now}V"
request_url = "%{req.url}V"
status = "%{resp.status}V"
cache_status = "%{resp.http.X-Cache}V"
country = "%{client.geo.country_code}V"
duration_ms = "%D"
})
}
force_destroy = true
}
Мгновенная публикация контента
При публикации статьи или товара достаточно вызвать API, чтобы инвалидировать только затронутые страницы:
class ArticlePublishedListener
{
public function handle(ArticlePublished $event): void
{
$article = $event->article;
Http::withHeaders(['Fastly-Key' => config('services.fastly.api_key')])
->post("https://api.fastly.com/service/{$serviceId}/purge", [
'urls' => [
"https://example.ru/blog/{$article->slug}",
"https://example.ru/blog/",
"https://example.ru/",
]
]);
}
}
Что входит в настройку Fastly CDN
- Аудит текущей архитектуры и трафика
- Разработка VCL-логики кэширования под ваш проект
- Настройка тегированной инвалидации (Surrogate-Key)
- Интеграция с backend (Laravel, Next.js, Django и др.)
- Настройка мониторинга и логов (S3, Elasticsearch, Kafka)
- Документация и обучение команды
- Пост-релизная поддержка в течение 2 недель
После настройки время инвалидации составляет менее 150 мс, HIT-ratio превышает 95%, а нагрузка на бэкенд снижается на 80%. Для одного из проектов ежемесячные расходы на CDN снизились с $4,500 до $1,200, а скорость загрузки страниц улучшилась на 40%. Как указано в документации Fastly, инвалидация кеша происходит менее чем за 150 мс.
Сроки и стоимость
Базовая настройка с VCL и тегированной инвалидацией занимает 2–3 дня. Для сложных проектов с кастомными правилами — до 5 дней. Стоимость рассчитывается индивидуально после аудита. Получите консультацию по настройке Fastly CDN — напишите нам.
Типичные ошибки при настройке Fastly
- Не настроена нормализация Accept-Encoding — разные версии URL попадают в кеш, снижая HIT-ratio.
- Отсутствует обработка Cookies — кешируются страницы с сессиями, что приводит к конфликтам данных.
- Слишком длинный TTL для HTML без grace-периода — при сбое origin пользователи видят ошибку.
- Не используются Surrogate-Key — инвалидация происходит по всему сайту, а не точечно.
Наши инженеры имеют 5+ лет опыта работы с Fastly и сертификаты по VCL. Мы гарантируем, что после настройки ваш сайт будет работать быстро и отказоустойчиво. Закажите аудит текущей CDN-архитектуры — и мы предложим оптимальное решение.







