Налаштування багаторівневого кешування (Browser → CDN → Varnish → Redis → DB)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування багаторівневого кешування (Browser → CDN → Varnish → Redis → DB)
Складна
~5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування багаторівневого кешування (Browser → CDN → Varnish → Redis → DB)

Багаторівневе кешування зменшує час відповіді та навантаження на базу даних завдяки послідовним шарам зберігання. Кожен рівень обслуговує запити без передачі їх на наступний — чим раніше потрапляння в кеш, тим швидша відповідь.

Схема рівнів

Browser Cache (0ms)
    ↓ miss
CDN (5-30ms, edge nodes)
    ↓ miss
Varnish (1-5ms, application layer)
    ↓ miss
Redis (1-5ms, application cache)
    ↓ miss
Database (5-100ms)

Рівень 1: Browser Cache

# nginx: заголовки для браузерного кешу
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

# HTML сторінки — не кешувати в браузері, але дозволити CDN
location ~* \.html$ {
    add_header Cache-Control "public, max-age=0, s-maxage=300";
    add_header Vary "Accept-Encoding, Accept-Language";
}

# API відповіді
location /api/ {
    add_header Cache-Control "private, no-store";
}

immutable — браузер не робить условні запити для файлів з версійними гешами.

Рівень 2: CDN (Cloudflare / CloudFront)

# cloudflare page rules
- pattern: "*.company.com/assets/*"
  settings:
    cache_level: cache_everything
    edge_cache_ttl: 2592000  # 30 днів
    browser_cache_ttl: 31536000  # 1 рік

- pattern: "*.company.com/*.html"
  settings:
    cache_level: cache_everything
    edge_cache_ttl: 300
    browser_cache_ttl: 0

CloudFront інвалідація при деплої:

aws cloudfront create-invalidation \
  --distribution-id $DISTRIBUTION_ID \
  --paths "/assets/*" "/*.html" "/sitemap.xml"

Рівень 3: Varnish

# /etc/varnish/default.vcl
vcl 4.1;

backend default {
    .host = "app-server";
    .port = "8080";
    .probe = {
        .url = "/health";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

sub vcl_recv {
    # Не кешувати аутентифіковані запити
    if (req.http.Authorization || req.http.Cookie ~ "session") {
        return (pass);
    }

    # Не кешувати POST/PUT/DELETE
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);
    }

    # Видалити непотрібні cookies для кешованих сторінок
    unset req.http.Cookie;
    return (hash);
}

sub vcl_backend_response {
    # Кешувати успішні відповіді
    if (beresp.status == 200 || beresp.status == 301) {
        if (beresp.http.Content-Type ~ "text/html") {
            set beresp.ttl = 5m;
        } else if (beresp.http.Content-Type ~ "application/json") {
            set beresp.ttl = 1m;
        }
        unset beresp.http.Set-Cookie;
    }

    # Grace period — повернути застарілий кеш при недоступності backend
    set beresp.grace = 1h;
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    set resp.http.X-Cache-Hits = obj.hits;
}

Інвалідація через PURGE:

curl -X PURGE -H "Host: company.com" http://varnish:6081/page/about

Рівень 4: Redis

from redis import Redis
import json, hashlib

redis = Redis(host='redis', decode_responses=True)

class MultiLevelCache:
    def get(self, key: str, db_fn, ttl: int = 300):
        # L1: Redis
        cached = redis.get(f"cache:{key}")
        if cached:
            return json.loads(cached), 'redis'

        # L2: Database
        data = db_fn()
        if data is not None:
            redis.setex(f"cache:{key}", ttl, json.dumps(data))
        return data, 'db'

    def invalidate(self, key: str):
        redis.delete(f"cache:{key}")
        # Інвалідувати Varnish
        self._purge_varnish(key)

    def _purge_varnish(self, path: str):
        import requests
        try:
            requests.request('PURGE', f"http://varnish:6081{path}",
                           headers={'Host': 'company.com'}, timeout=2)
        except:
            pass

Координація інвалідації між рівнями

При змінах даних інвалідувати всі рівні:

def on_product_updated(product_id):
    # Redis
    redis.delete(f"product:{product_id}")
    redis.delete(f"category_products:{product.category_id}")

    # Varnish (HTTP PURGE)
    purge_varnish(f"/products/{product_id}")
    purge_varnish(f"/categories/{product.category_id}")

    # CDN (Cloudflare Cache Tag)
    cloudflare_purge_by_tag(f"product-{product_id}")
    cloudflare_purge_by_tag(f"category-{product.category_id}")

Cloudflare Cache Tags (потребує Enterprise або Cache Rules):

requests.post(
    f"https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache",
    headers={"Authorization": f"Bearer {token}"},
    json={"tags": [f"product-{product_id}"]}
)

Моніторинг Hit Rate за рівнями

# Varnish
varnish_main_cache_hit / (varnish_main_cache_hit + varnish_main_cache_miss)

# Redis
redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total)

# CDN: через Cloudflare Analytics API / CloudFront metrics

Цільові показники:

  • Browser cache hit rate: >60% для статики
  • CDN hit rate: >80% для публічних сторінок
  • Varnish hit rate: >70% для HTML
  • Redis hit rate: >85% для даних

Тривалість

Налаштування повного стеку Browser→CDN→Varnish→Redis — 4–7 робочих днів. Включає налаштування інвалідації, моніторингу та нагрузочного тестування.