Что такое Varnish Cache: установка и базовая настройка Varnish Cache Server
Varnish Cache — это кеш обратного прокси, который стоит перед веб-сервером, хранит HTTP-ответы в памяти и отвечает на одинаковые запросы, не обращаясь к исходному серверу. Когда мы поставили Varnish 6.6.2 перед WordPress на сервере AlmaLinux 9.8, страницы не кешировались из-за max-age=0, и мы решили это, задав время хранения в VCL.
Какие запросы кешировать и сколько их хранить, вы описываете в файле VCL (Varnish Configuration Language).
1️⃣ Принцип Varnish Cache: кеш обратного прокси
Для каждого запроса Varnish сначала проверяет, есть ли сохранённый ответ. Если он отвечает сохранённым ответом, это попадание в кеш (HIT); если ответ нужно получить с исходного сервера (бэкенда), это промах кеша (MISS). Ответ, полученный при промахе, хранится в течение времени хранения и используется для следующих запросов.
Open-source-версия Varnish не поддерживает TLS, поэтому не может напрямую принимать HTTPS-запросы. На порту 443 TLS обрабатывает Nginx или HAProxy, а затем передаёт запрос в Varnish.
Открытый проект Varnish Cache начиная с версии 9.0, вышедшей в марте 2026 года, сменил название на Vinyl Cache. Название Varnish Cache продолжает использовать версия, которую Varnish Software распространяет с добавленными функциями TLS.
2️⃣ Установка Varnish Cache Server
В AlmaLinux 9 вы устанавливаете его пакетом varnish из стандартного репозитория (AppStream); версия этого пакета — Varnish 6.6.2, выпущенная ещё до смены названия.
dnf -y install varnishПосле установки проверьте версию командой [varnishd -V].
varnishd -Vvarnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish SoftwareПакеты семейства RHEL оставляют версию 6.6.2, поддержка которой проектом уже закончилась, и распространяют её, добавляя только исправления безопасности. Пакет 6.6.2-7, вышедший в июне 2025 года, содержит исправление уязвимости HTTP request smuggling (CVE-2025-47905).
При установке также создаются [/etc/varnish/default.vcl] и [/usr/lib/systemd/system/varnish.service].
grep ExecStart= /usr/lib/systemd/system/varnish.serviceExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m[-a :6081] задаёт порт, на который приходят запросы, а [-s malloc,256m] — 256MB памяти, отведённых под хранилище кеша.
3️⃣ Базовая настройка: бэкенд и порт
В стандартном файле VCL [/etc/varnish/default.vcl] бэкендом с самого начала указан порт 8080 того же сервера.
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}В Apache измените значение [Listen] в [httpd.conf] на 8080, чтобы он принимал запросы, которые передаёт Varnish.
# /etc/httpd/conf/httpd.conf
Listen 8080Для сайтов с HTTPS оставьте Varnish на порту 6081 и подключите Nginx, который обрабатывает TLS, так, чтобы он передавал запросы в Varnish.
Схема, в которой Varnish принимает запросы прямо на порту 80, подходит для сайтов, работающих только по HTTP. В этом случае создайте копию файла службы, как описано в документации Varnish Software по установке, и замените 6081 на 80 в строке [ExecStart].
systemctl edit --full varnishКопия, сохранённая в редакторе, создаётся в [/etc/systemd/system/varnish.service], и изменённый порт сохраняется даже после обновления пакета.
systemctl enable --now varnishКакую бы схему вы ни выбрали, в конце командой enable с параметром now зарегистрируйте автозапуск при загрузке и сразу запустите Varnish.
4️⃣ Проверка работы: заголовки X-Varnish и Age
После запуска Varnish проверьте по заголовкам ответа, действительно ли страницы WordPress отдаются из кеша. Запрос отправляется прямо на порт 6081 Varnish, минуя Nginx, поэтому домен и признак HTTPS передаются заголовками [Host] и [X-Forwarded-Proto].
curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1001
Age: 0
Via: 1.1 varnish (Varnish/6.6)[X-Varnish] — номер, который Varnish присваивает запросу, а [Via: 1.1 varnish] показывает, что ответ прошёл через Varnish. [Age] — время (в секундах), прошедшее с момента сохранения ответа в кеше.
Даже при повторной отправке того же запроса через 3 секунды у [X-Varnish] был один номер, а [Age] был равен 0, то есть снова ответил исходный сервер. Правило, которое плагин кеширования добавил в [.htaccess], добавляет к HTML [max-age=0], поэтому стандартная настройка Varnish рассчитала время хранения как 0 секунд.
Запросы с cookie при стандартной настройке тоже идут мимо кеша. То же касается cookie инструментов веб-аналитики, поэтому все запросы посетителей с такими cookie уходят на исходный сервер.
VCL ниже передаёт на исходный сервер запросы входа и админки, а также запросы, отличные от GET и HEAD, а остальные запросы кеширует, удалив из них cookie. Ответы с временем хранения 0 секунд, которые не создают cookie, хранятся 10 минут, а ответы, запрещающие хранение, например [no-cache], не сохраняются.
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.method != "GET" && req.method != "HEAD") {
return (pass);
}
if (req.url ~ "^/(wp-admin|wp-login\.php)" || req.http.Cookie ~ "wordpress_logged_in_|wp-postpass_|comment_author_") {
return (pass);
}
unset req.http.Cookie;
}
sub vcl_backend_response {
if (beresp.ttl <= 0s && !beresp.http.Set-Cookie) {
set beresp.ttl = 10m;
}
}После изменения файла VCL перезагрузите его командой [systemctl reload varnish]. Ниже — второй из двух ответов, полученных при двукратной отправке одного и того же запроса в Varnish с этим VCL.
curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1004 1002
Age: 3
Via: 1.1 varnish (Varnish/6.6)Во втором запросе, отправленном через 3 секунды после применения VCL, у [X-Varnish] было два номера, а [Age] был равен 3. Два номера означают, что ответил кеш, а второй номер принадлежит запросу, который получил эту страницу с исходного сервера и сохранил её.
Запрос с cookie входа получил один номер, и ответил исходный сервер, а запрос только с cookie инструмента аналитики получил ответ из кеша.
🔢 FAQ & рекомендуемые материалы
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.