Wiki
Web / стек

Varnish Cache — что это простыми словами

Varnish — HTTP-кэш-прокси перед приложением. Отдаёт кэшированные ответы за миллисекунды, освобождая backend. Стандарт крупных новостных сайтов.

Varnish Cache — reverse-proxy с фокусом на HTTP-кэширование в оперативной памяти. Ставится перед backend'ом (nginx/Apache + PHP-app), кэширует ответы по HTTP-заголовкам (Cache-Control, Vary) и отдаёт клиенту при повторных запросах напрямую из RAM. Типовой speedup: 10-100× по latency, 100-1000× по throughput.

Использует собственный язык VCL (Varnish Configuration Language), компилируется в C и загружается в runtime. Пример: `vcl_recv { if (req.url ~ "\.png$") { set req.http.Cookie = ""; }; }` — убрать cookies с запросов на PNG, чтобы кэш работал (иначе Varnish считает каждый запрос уникальным).

Классические use-case: (1) новостной сайт — статьи меняются раз в час, но читаются миллионы раз. Cache HIT ratio 95 %, backend получает 5 % трафика. (2) e-commerce каталог — категории/фильтры кэшируются на 1-5 мин, checkout всегда bypass. (3) API-gateway — кэшировать `/api/v1/products` для `GET`, invalidate по PURGE-запросу из backend'а.

Ограничения: HTTPS Varnish не умеет — надо ставить nginx/hitch перед ним как SSL-terminator. При рестарте кэш теряется (in-memory), нужен «прогрев». Persistent storage через MSE (Massive Storage Engine, коммерческая версия).

Альтернативы: nginx fastcgi/proxy_cache — проще, интегрировано, но без VCL-мощности. Cloudflare — SaaS-эквивалент, edge-cache. Fastly — коммерческий Varnish с CDN. Redis — если кэшируете уровнем ниже HTTP (на уровне запросов к БД).

Частые вопросы

Varnish или nginx cache?
Для 90 % задач хватит nginx. Varnish берут, когда нужны сложные VCL-правила, ESI (Edge Side Includes) или PURGE-based invalidation.
Как проверить, что Varnish кэширует?
`curl -I https://site.com` → смотрим header `X-Cache: HIT/MISS`. Или `varnishlog -q 'ReqURL eq "/path"'`.