Что такое Varnish Cache: установка и базовая настройка Varnish Cache Server

Тестовая среда Семейство RHELAlmaLinux 9.8Учётная запись rootПроверено 2026-10-16

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 -V
varnishd (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.service
ExecStart=/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 & рекомендуемые материалы

Если задать в VCL время хранения 10 минут, в течение этих 10 минут отдаётся сохранённая в кеше страница до правки. Чтобы очищать кеш сразу при сохранении записи, нужны правило VCL для обработки запросов PURGE и плагин вроде Proxy Cache Purge. В VCL ограничьте запросы PURGE так, чтобы принимались только отправленные с того же сервера.

Если веб-сервер отдаёт HTML-файлы, созданные плагином кеширования, напрямую без PHP, Varnish выполняет ту же работу ещё раз. Если же кешированные страницы всё равно проходят через PHP, Varnish отвечает перед ним и сокращает выполнение PHP.

Сайт может использовать Varnish, даже если заголовок не виден: администраторы серверов иногда переименовывают или удаляют заголовки ответа. На сервере Cloudways с включённым Varnish в ответах WordPress были заголовки [x-cache: HIT] и [age] вместо [X-Varnish].

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 6   +   6   =