Налаштування 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-архітектури — і ми запропонуємо оптимальне рішення.







