Varnish WordPress кэширование: полное руководство по настройке и оптимизации

Введение

Varnish Cache – один из самых быстрых HTTP‑акселераторов, способный снизить нагрузку на сервер WordPress до до 90%. В этой статье мы разберём, как правильно установить Varnish, настроить Edge Side Includes (ESI), обеспечить мгновенную очистку кэша при публикации записей и правильно работать с cookie. Кроме того, покажем, как интегрировать Varnish с популярными плагинами кэширования. Для полного понимания смежных техник читайте также ускоряем WordPress: preload, prefetch и другие resource hints.

Установка и базовая настройка Varnish для WordPress

Перед началом убедитесь, что ваш сервер поддерживает Varnish (Ubuntu 20.04, Debian 11 и т.п.). Установить его можно одной командой:

sudo apt-get update && sudo apt-get install varnish

После установки необходимо перенаправить порт 80 на Varnish, а Varnish – на бекенд‑сервер Apache/Nginx, где работает WordPress.

Редактирование конфигурации Varnish

Откройте файл /etc/varnish/default.vcl и задайте бекенд:

backend default {.host = "127.0.0.1";.port = "8080"; // Apache/Nginx слушает 8080 } sub vcl_recv { # Пропускаем кэш для админки и авторизованных пользователей if (req.url ~ "^/wp-(admin|login)" || req.http.Cookie ~ "wordpress_logged_in") { return (pass); } # Обычная кэш‑политика return (hash); } 

Перезапустите Varnish:

sudo systemctl restart varnish

Для повышения производительности можно включить PHP 8 JIT, что уменьшит время генерации HTML‑страниц, а Varnish будет обслуживать их из памяти.

Применение Edge Side Includes (ESI) в WordPress

ESI позволяет кэшировать большую часть страницы, оставляя «динамические» блоки (например, корзину WooCommerce) отдельными запросами. Для включения ESI в Varnish необходимо добавить в VCL поддержку тегов esi:

sub vcl_backend_response { if (beresp.http.Content-Type ~ "text/html") { set beresp.do_esi = true; } } 

В шаблонах темы WordPress используйте функцию esi_include() (можно добавить в functions.php):

function esi_include( $callback ) { echo "<esi:include src='". esc_url( $callback ). "'>"; } // Пример в header.php esi_include( home_url( '/wp-admin/admin-ajax.php?action=mini_cart' ) ); 

Таким образом, Varnish кэширует основную часть страницы, а запросы к /admin-ajax.php обрабатываются отдельно, гарантируя актуальность корзины и пользовательских уведомлений.

Автоматическая очистка кэша при публикации контента

Самый надёжный способ – использовать плагин Varnish HTTP Purge. После установки плагин отправляет BAN-запросы в Varnish при событиях save_post, delete_post и comment_post. Если вы предпочитаете решение без плагинов, можно добавить в functions.php webhook:

add_action( 'save_post', 'purge_varnish_on_save', 10, 2 ); function purge_varnish_on_save( $post_id, $post ) { if ( wp_is_post_revision( $post_id ) ) return; $host = '127.0.0.1'; $port = 6081; // Varnish admin порт $url = 'http://'. $host. ':'. $port. '/'; $ch = curl_init( $url ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'BAN' ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Host: example.com', 'X-Ban-Url: '. home_url( '/' ) )); curl_exec( $ch ); curl_close( $ch ); } 

В VCL необходимо добавить обработчик ban‑запросов:

acl purge { "localhost"; "127.0.0.1"; } sub vcl_recv { if (req.method == "BAN") { if (!client.ip ~ purge) { return (synth(403, "Forbidden")); } if (req.http.X-Ban-Url) { ban("req.http.host == "" + req.http.Host + "" && req.url ~ "" + req.http.X-Ban-Url + """); return (synth(200, "Banned")); } } } 

Работа с cookie и интеграция с плагинами кэширования

WordPress активно использует cookie для авторизации и персонализации. Чтобы Varnish мог кэшировать ответы для гостей, необходимо удалить лишние cookie‑заголовки в vcl_recv:

if (req.http.Cookie) { # Удаляем только те cookie, которые нужны для авторизации set req.http.Cookie = regsuball(req.http.Cookie, "(?i)wordpress_logged_in_[^=]*=[^;]*;?", ""); set req.http.Cookie = regsuball(req.http.Cookie, "(?i)comment_author_[^=]*=[^;]*;?", ""); # Если после очистки cookie пустой – удаляем заголовок полностью if (req.http.Cookie == "") { unset req.http.Cookie; } } 

После этой оптимизации большинство запросов будет обслуживаться из кэша, а динамические части (корзина, личный кабинет) останутся доступными благодаря ESI.

Если вы уже используете плагин кеширования, например WP Super Cache или LiteSpeed Cache, настройте их в режиме «Cache for guests only», а в Varnish оставьте правило pass только для URL‑адресов админки и API.

Заключение

Настройка Varnish для WordPress – мощный способ снизить TTFB, уменьшить нагрузку на PHP‑процессы и обеспечить мгновенную отдачу статических страниц. Ключевые шаги: установить и сконфигурировать Varnish, включить ESI для динамических блоков, реализовать автоматическую очистку кэша при публикации и правильно работать с cookie. При правильной интеграции с плагинами кэширования ваш сайт может выдерживать десятки тысяч запросов в секунду без деградации производительности. Не забывайте периодически проверять логи Varnish (varnishlog) и обновлять правила, чтобы поддерживать синхронность с изменениями в теме и плагинах.

❓ Часто задаваемые вопросы

Как заставить Varnish игнорировать cookie WordPress?

В VCL‑файле нужно добавить правило, которое удаляет cookie «wordpress_logged_in» и «comment_author_» из запросов к статическому контенту, тем самым позволяя Varnish кэшировать ответы.

Можно ли использовать Varnish вместе с плагином WP Super Cache?

Да, но необходимо отключить двойное кэширование: плагин хранит файлы в disk, а Varnish – в RAM. Настройте плагин на работу в режиме «Cache for logged‑in users only».

Как настроить автоматическую очистку кэша при публикации поста?

Подключите webhook WordPress REST API к Varnish через ban-запросы в VCL или используйте плагин «Varnish HTTP Purge», который отправит PURGE-запросы при событии save_post.

Что делать, если Varnish кэширует устаревший контент после обновления темы?

Убедитесь, что в VCL прописаны правила для Cache-Control: no-cache на файлы шаблонов и используйте varnishadm ban для принудительного сброса.