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 для принудительного сброса.