Настройка CDN (Fastly) для сайта

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка CDN (Fastly) для сайта
Сложная
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Настройка Fastly CDN

Fastly — CDN с акцентом на мгновенную инвалидацию кеша (< 150 мс по всей сети) и программируемую логику на edge через VCL (Varnish Configuration Language) и Compute@Edge (WASM). Используется когда нужен полный контроль над логикой кеширования или мгновенное обновление контента.

Ключевые отличия от Cloudflare/CloudFront

Возможность Fastly Cloudflare CloudFront
Инвалидация кеша < 150 мс 1–30 с 1–5 мин
Программирование edge VCL + WASM Workers (JS) Functions (JS)
Тег-инвалидация Да (Surrogate-Key) Нет Нет
Real-time логи Да Да Через S3
Streaming Отличное Хорошее Хорошее

Подключение через API

Fastly управляется полностью через API или Terraform-провайдер:

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 компрессия
    gzip {
        name       = "gzip-policy"
        content_types = ["text/html", "text/css", "application/javascript", "application/json"]
        extensions = ["css", "js", "html", "json"]
    }

    # Логирование в S3
    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
    }

    force_destroy = true
}

VCL — кастомная логика кеширования

Fastly выполняет VCL (Varnish Configuration Language) на каждом запросе. Более мощный чем 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";
    }
}

Surrogate-Key — тегированная инвалидация

Fastly поддерживает инвалидацию по тегам — главное преимущество перед конкурентами:

// 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}"
        );
    }
}

Мгновенная публикация контента

// Артикл опубликован — мгновенно инвалидировать кеш
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/",
                ]
            ]);
    }
}

Compute@Edge — WASM на edge

// Пример на Rust: A/B тестирование на edge
use fastly::http::Method;
use fastly::{Error, Request, Response};

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
    // 50% трафика → версия B
    let variant = if rand::random::<bool>() { "b" } else { "a" };

    let mut bereq = req.clone_without_body();
    bereq.set_header("X-AB-Variant", variant);

    let mut beresp = bereq.send("origin")?;
    beresp.set_header("X-AB-Variant", variant);

    Ok(beresp)
}

Real-time логи и аналитика

Fastly отправляет логи в реальном времени в Elasticsearch, S3, Kafka, BigQuery:

resource "fastly_service_vcl" "main" {
    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"
        })
    }
}

Срок настройки: 2–3 дня для базовой конфигурации с VCL и тегированной инвалидацией.