Микро‑кэширование WordPress: ускоряем динамический контент за 1‑5 секунд

Введение в микро‑кэширование WordPress

Микро‑кэширование – это техника, позволяющая хранить небольшие фрагменты HTML‑вывода (например, блоки навигации, рекламные баннеры или списки последних записей) на несколько секунд. В отличие от полного кэширования страниц, микро‑кэш сохраняет интерактивность сайта, а динамические части обновляются почти мгновенно. В этой статье мы разберём, как внедрить микро‑кэширование на серверах Nginx и Apache, использовать ESI (Edge Side Includes) и интегрировать кэш‑слой Redis для ускорения.

Почему именно 1‑5 секунд?

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

Настройка микро‑кэша на Nginx

Для Nginx мы будем использовать proxy_cache совместно с директивой proxy_cache_valid и заголовками Cache‑Control. Основная идея – кэшировать отдельные запросы к /wp‑content/cache‑fragment/, где будет храниться HTML‑фрагмент.

Шаг 1. Создаём отдельный location

# /etc/nginx/conf.d/micro-cache.conf location ~ ^/wp-content/cache-fragment/(.*).html$ { internal; # запрашивается только из Nginx proxy_pass http://127.0.0.1:8080; # ваш бекенд PHP‑FPM proxy_cache micro_cache; proxy_cache_valid 200 1s; # кэшировать 200‑ответы 1 секунду add_header X-Micro-Cache $upstream_cache_status; } 

Директива internal защищает путь от прямого доступа пользователем.

Шаг 2. Определяем кэш‑зону

http { proxy_cache_path /var/cache/nginx/micro_cache levels=1:2 keys_zone=micro_cache:10m max_size=500m inactive=60s use_temp_path=off; # остальные настройки … } 

Объём 10 МБ для метаданных достаточно для тысяч фрагментов.

Шаг 3. Вставляем ESI‑тег в шаблон

<!-- wp:html --> <esi:include src="/wp-content/cache-fragment/recent-posts.html" /> <!-- /wp:html --> 

WordPress сам не понимает ESI, но большинство CDN (например, Cloudflare) и Nginx с модулем ngx_esi умеют подставлять содержимое.

Микро‑кэширование на Apache с mod_cache

Если ваш сайт работает на Apache, используйте модуль mod_cache и mod_cache_socache. Мы будем кэшировать запросы к виртуальному пути /cache-fragment/.

Шаг 1. Включаем модули

a2enmod cache a2enmod cache_socache systemctl restart apache2 

Шаг 2. Добавляем правила в.htaccess

#.htaccess в корне сайта <IfModule mod_cache.c> CacheQuickHandler off CacheEnable socache /cache-fragment/ CacheHeader on CacheIgnoreNoLastMod On CacheDefaultExpire 1 CacheMaxExpire 5 ExpiresActive On ExpiresDefault "access plus 1 seconds" Header set X-Micro-Cache "%{CACHE_STATUS}e" env=CACHE_STATUS </IfModule> 

Здесь CacheDefaultExpire 1 задаёт базовый срок – 1 секунда, а CacheMaxExpire 5 ограничивает максимум 5 секунд.

Шаг 3. Генерируем фрагмент через PHP

// functions.php function get_recent_posts_fragment() { $transient_key = 'micro_fragment_recent_posts'; $html = get_transient( $transient_key ); if ( false === $html ) { ob_start(); $query = new WP_Query( array( 'posts_per_page' => 5, 'no_found_rows' => true, ) ); if ( $query->have_posts() ) { echo '<ul class="micro-recent">'; while ( $query->have_posts() ) { $query->the_post(); echo '<li><a href="'. esc_url( get_permalink() ). '">'. get_the_title(). '</a></li>'; } echo '</ul>'; } wp_reset_postdata(); $html = ob_get_clean(); // Кешируем на 3 секунды в Redis (см. ниже) set_micro_fragment( $transient_key, $html, 3 ); } return $html; } function set_micro_fragment( $key, $value, $ttl ) { if ( class_exists( 'Redis' ) ) { $redis = new Redis(); $redis->connect( '127.0.0.1', 6379 ); $redis->setex( $key, $ttl, $value ); } else { set_transient( $key, $value, $ttl ); } } 

Функцию get_recent_posts_fragment() можно вызвать в шаблоне: <?php echo get_recent_posts_fragment();?>. При первом запросе фрагмент сохраняется в Redis, а последующие запросы обслуживаются из кэша 1‑5 сек.

Интеграция Redis для микрокэша

Redis идеально подходит для хранения микрофрагментов, потому что поддерживает TTL (time‑to‑live) с точностью до секунды. Если ваш хостинг поддерживает Redis, используйте пример из статьи Как настроить Redis на shared хостинге для WordPress.

Подключение к Redis из WordPress

// wp-config.php define('WP_REDIS_HOST', '127.0.0.1'); define('WP_REDIS_PORT', 6379); 

Плагин Redis Object Cache автоматически использует эти константы. Для микрокэша мы можем работать напрямую, как показано в функции set_micro_fragment() выше.

ESI‑фрагменты и CDN‑плюс

Если ваш сайт обслуживается через Cloudflare или Fastly, включите поддержку ESI. Это позволит CDN собрать страницу из кэшированных фрагментов, не прибегая к запросам к вашему серверу.

Настройка ESI в Cloudflare

  • Включите “Cache‑Based on URL Query String” и добавьте правило Cache‑Level: Bypass для пути /wp-content/cache-fragment/*.
  • В разделе Transform Rules создайте правило, которое заменит <esi:include … /> на реальный HTML‑контент, используя Edge Workers.

Благодаря такому подходу, даже при 100 000 запросов в минуту ваш бекенд будет обрабатывать лишь несколько запросов за секунду.

Тестирование и мониторинг

После внедрения микро‑кэша важно убедиться, что кэш‑статус меняется, а TTL соблюдается. Для этого можно добавить простую отладочную строку в шаблон:

<?php echo '<!-- Micro‑Cache: '. ( defined('DOING_AJAX')? 'AJAX' : '' ). ' -->';?> 

Также рекомендуется использовать GitHub Actions для WordPress плагина чтобы автоматически проверять, что кэш‑заголовки присутствуют в ответах.

Метрики

  1. Время до первого байта (TTFB) – должно упасть с 300 мс до < 100 мс.
  2. CPU‑нагрузка PHP‑FPM – снижение на 30‑40 %.
  3. Кол‑во запросов к базе MySQL – сокращение в 5‑10 раз.

Для визуализации используйте гайд по Edge Computing – он показывает, как собрать метрики в Grafana.

Заключение

Микро‑кэширование WordPress – простой, но мощный способ ускорить динамический контент без потери интерактивности. Мы разобрали настройку на Nginx и Apache, показали, как хранить фрагменты в Redis с TTL 1‑5 сек, интегрировали ESI‑теги и предложили инструменты мониторинга. Применив эти техники, вы сможете увеличить скорость сайта до 300 % и снизить нагрузку на сервер, что особенно ценно в периоды всплесков трафика.

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

Какой минимальный TTL рекомендуется для микрокэша?

Оптимальный диапазон – от 1 до 5 секунд. Он позволяет обновлять контент часто, но при этом значительно снижает количество запросов к PHP.

Можно ли использовать микро‑кэширование вместе с полноценным плагином кэширования?

Да. Микро‑кэш работает на уровне фрагментов, а плагин (например, WP Rocket) кэширует полностью статические страницы. Оба уровня взаимодействуют без конфликтов.

Нужен ли отдельный сервер Redis для микрокэша?

Если у вас уже есть Redis‑кеш для объектов, использовать его удобно. Для небольших проектов можно обойтись локальным Redis‑инстансом на том же сервере.

Как проверить, что ESI‑тег действительно подставляется CDN?

Откройте DevTools → Network и найдите запрос к /wp-content/cache-fragment/…. Если статус 200 и заголовок X-Micro-Cache присутствует, CDN корректно обрабатывает ESI.