Varnish Cache — специализированный HTTP reverse proxy, разработанный исключительно для кэширования веб-трафика. В отличие от Nginx или Apache, Varnish не умеет обслуживать статику напрямую с диска или терминировать SSL — он делает одно и делает это быстро: хранит HTTP-ответы в памяти и отдаёт их при повторных идентичных запросах, не обращаясь к бэкенду. Один сервер Varnish способен обрабатывать от 100 000 до 1 000 000 запросов в секунду.
Как работает Varnish
Запрос от клиента попадает на Varnish. Если ответ есть в кэше (cache hit) — Varnish отвечает немедленно из памяти, типичное время ответа составляет 0.1–1 мс против 50–300 мс при обращении к PHP-бэкенду. Если кэша нет (cache miss) — Varnish запрашивает бэкенд (Apache, Nginx, WordPress), сохраняет ответ и отдаёт клиенту.
Поведение Varnish определяет VCL (Varnish Configuration Language) — собственный DSL-язык, компилируемый в C-код. В VCL описываются правила: какие URL кэшировать, на сколько времени (TTL), какие заголовки передавать бэкенду, как инвалидировать кэш через PURGE-запросы. Это даёт гибкость, недоступную статическим конфигурациям.
Для кэширования фрагментов страниц Varnish поддерживает ESI (Edge Side Includes) — директивы в HTML, указывающие, какой блок загрузить из кэша, а какой — с бэкенда. Так новостная лента кэшируется с TTL 60 секунд, а блок личного кабинета всегда берётся из бэкенда.
История
Varnish создал норвежский разработчик Пол-Хеннинг Камп (Poul-Henning Kamp) по заказу норвежской газеты Verdens Gang в 2005–2006 годах — сайт газеты не справлялся с нагрузкой на Squid. Первый публичный релиз Varnish 1.0 вышел в 2006 году. В 2008 году появился VCL и поддержка grace mode (отдача устаревшего кэша при недоступности бэкенда). Varnish 4.0 (2014) принёс переработанную архитектуру потоков и поддержку PURGE. Varnish 6.0 (2018) ввёл HTTP/2 и Varnish Enterprise ответвился как коммерческий продукт с модулями VMOD для динамического кэширования.
Ключевые режимы кэширования
- TTL (Time To Live) — время жизни объекта в кэше, задаётся через заголовок
Cache-Control: max-age=Nили в VCL. - Grace mode — Varnish отдаёт устаревший кэш (stale), пока обновляет его в фоне, предотвращая thundering herd при массовых запросах.
- Saint mode — при недоступности бэкенда Varnish временно исключает его из пула и использует другой бэкенд.
- Purge — принудительная инвалидация конкретного URL через HTTP PURGE-запрос; часто используется CMS при публикации нового материала.
Varnish в контексте хостинга
Varnish ставится перед веб-сервером и снижает нагрузку на базу данных и PHP-интерпретатор. Для WordPress Varnish работает в связке с плагинами типа Varnish HTTP Purge, которые отправляют PURGE при сохранении поста. Для интернет-магазинов ESI позволяет кэшировать каталог целиком, не кэшируя корзину и блок авторизации. На VDS Varnish обычно слушает порт 80, а Nginx — порт 8080; SSL терминирует Nginx или HAProxy на порту 443 перед Varnish.
Hit rate (доля запросов, обслуженных из кэша) — ключевая метрика. Целевое значение для новостных сайтов — 85–95%, для интернет-магазинов — 60–80%. Мониторинг осуществляется командой varnishstat, которая показывает hit/miss/pass в реальном времени.
Varnish vs Nginx proxy_cache
Nginx тоже умеет кэшировать через директиву proxy_cache, но хранит кэш на диске, а не в RAM — это медленнее на 3–10x для горячих данных. Varnish хранит весь кэш в оперативной памяти (configurable до нескольких гигабайт), поэтому при одинаковом hit rate выдаёт меньшую задержку. Для высоконагруженных новостных порталов и e-commerce Varnish предпочтительнее; для небольших проектов Nginx proxy_cache проще в конфигурации.