הגדרת Fastly CDN לפרויקטים בעלי עומס גבוה
כשהאתר שלכם מתחיל להאט עקב עליות תנועה ואי-התוקף של מטמון לוקח דקות, רשתות CDN סטנדרטיות לא עומדות במשימה. אנו רואים לעתים קרובות פרויקטים שבהם התוכן מתעדכן כל כמה שניות אך המטמון חי שעה—מה שגורם לנתונים מיושנים. Fastly פותרת זאת עם אי-התוקף מיידי (<150 אלפיות השנייה ברחבי הרשת שלה) ולוגיקת קצה הניתנת לתכנות באמצעות VCL ו-Compute@Edge. זו הבחירה לפרויקטים שזקוקים לשליטה מלאה במטמון ולגמישות.
אנו משתמשים ב-Fastly לתוכן דינמי: פורטלי חדשות, מסחר אלקטרוני, פלטפורמות SaaS. לאחר ההתקנה, יחס ה-HIT מגיע ל-95%, ומפחית את העומס על השרת האחורי ב-80%. להלן נפרט את התכונות המרכזיות ודוגמאות תצורה מעשיות.
מדוע Fastly עולה על רשתות CDN אחרות?
| תכונה | Fastly | Cloudflare | CloudFront |
|---|---|---|---|
| אי-תוקף | <150 אלפיות השנייה | 1–30 שניות | 1–5 דקות |
| תכנות קצה | VCL + WASM | Workers (JS) | Functions (JS) |
| אי-תוקף לפי תגיות | כן (Surrogate-Key) | לא | לא |
| לוגים בזמן אמת | כן | כן | דרך S3 |
| סטרימינג | מצוין | טוב | טוב |
Fastly מבטלת תוקף פי 10 מהר יותר מ-CloudFront ופי 20 מהר יותר מ-Cloudflare. וSurrogate-Key לאי-תוקף לפי תגיות מאפשר לכם לנקות רק את הדפים הרלוונטיים מבלי להשפיע על כל האתר.
כיצד אנו מתקינים Fastly CDN: שלבים
ההתקנה מתבצעת בשלבים:
- ניתוח — בדיקת הארכיטקטורה הנוכחית, התנועה ודרישות המטמון.
- עיצוב — פיתוח לוגיקת VCL: אילו כתובות URL לשמור במטמון, אילו להעביר, כיצד לטפל בעוגיות.
- יישום — פריסת השירות באמצעות Terraform או API, כתיבת כללי VCL, הגדרת Surrogate-Key בשרת האחורי.
- בדיקות — אימות אי-תוקף, ביצועים, תקינות המטמון.
- פריסה — הפעלת CDN בסביבת הייצור, ניטור ואופטימיזציה.
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח | 1–2 ימים | דיאגרמת ארכיטקטורה, דרישות |
| עיצוב | יום אחד | לוגיקת VCL, תוכנית אי-תוקף |
| יישום | 1–2 ימים | שירות פעיל ב-Fastly |
| בדיקות | יום אחד | דוח ביצועים |
| פריסה | חצי יום | 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 או במשתני סביבה.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 ל-95%.פריסה באמצעות Terraform
Fastly מנוהלת במלואה דרך API או ספק Terraform. להלן דוגמת תצורה עם backend, 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
- אינטגרציה עם השרת האחורי (Laravel, Next.js, Django וכו')
- הגדרת ניטור ולוגים (S3, Elasticsearch, Kafka)
- תיעוד והדרכת צוות
- תמיכה לאחר השחרור למשך שבועיים
לאחר ההתקנה, זמן אי-התוקף הוא מתחת ל-150 אלפיות השנייה, יחס ה-HIT עולה על 95%, והעומס על השרת האחורי יורד ב-80%. בפרויקט אחד, עלויות ה-CDN החודשיות ירדו מ-$4,500 ל-$1,200, ומהירות טעינת הדף השתפרה ב-40%. כפי שצוין בתיעוד של Fastly, אי-התוקף של המטמון מתרחש תוך פחות מ-150 אלפיות השנייה.
לוחות זמנים ועלות
התקנה בסיסית עם VCL ואי-תוקף לפי תגיות אורכת 2–3 ימים. לפרויקטים מורכבים עם כללים מותאמים אישית, עד 5 ימים. העלות נקבעת בנפרד לאחר בדיקה. קבלו ייעוץ על הגדרת Fastly CDN — צרו קשר.
טעויות נפוצות בהתקנת Fastly
- חוסר נרמול Accept-Encoding: גרסאות שונות של כתובות URL נכנסות למטמון, מה שמפחית את יחס ה-HIT.
- ללא טיפול בעוגיות: דפים עם סשנים נשמרים במטמון, מה שגורם לסכסוכי נתונים.
- TTL ארוך מדי ל-HTML ללא תקופת חסד: כשל בשרת המקור גורם לשגיאות למשתמשים.
- אי שימוש ב-Surrogate-Key: אי-התוקף מתרחש בכל האתר במקום ממוקד.
למהנדסים שלנו יש ניסיון של 5+ שנים עם Fastly והסמכות VCL. אנו מבטיחים שאחרי ההתקנה, האתר שלכם יהיה מהיר ועמיד. הזמינו בדיקה של ארכיטקטורת ה-CDN הנוכחית שלכם — ונציע את הפתרון האופטימלי.







