На динамическом сайте каждый запрос обычно проходит один и тот же путь: веб-сервер передаёт его PHP, PHP получает данные из базы, собирает шаблоны, и в итоге формируется HTML-страница. Если содержимое страницы одинаково для всех посетителей, повторять эту работу каждый раз бессмысленно. Полностраничный кеш сохраняет готовый HTML и отдаёт его следующим посетителям напрямую. При этом не запускаются ни PHP, ни база данных, поэтому время ответа резко сокращается, а нагрузка на сервер падает.
Чем полностраничный кеш отличается от других видов кеша
У сайта обычно несколько уровней кеширования, и их важно не путать. Кеш браузера хранит изображения, CSS и JavaScript на компьютере пользователя. Object cache держит в памяти отдельные фрагменты данных из базы, но страницу всё равно собирает PHP. OPcache сохраняет скомпилированный PHP-код. Полностраничный кеш работает на самом верхнем уровне: он хранит весь ответ целиком, и запрос до PHP просто не доходит.
Поэтому это самый эффективный и одновременно самый требовательный к аккуратности способ. При неправильной настройке личные данные одного пользователя могут показаться другому, а изменённая цена — часами не обновляться.
Каким сайтам он особенно полезен
Лучший результат дают сайты, где содержимое меняется редко, а большинство посетителей не авторизуется: корпоративные сайты, новостные порталы, блоги, каталоги услуг, сайты школ и клиник. Например, сайт частной клиники в Самарканде состоит из страниц со списком врачей, ценами на услуги и адресом. Их обновляют раз-два в неделю, но во время рекламной кампании за день их открывают тысячи людей. С кешем каждая страница собирается один раз, а дальше отдаётся из памяти или с диска, так что резкий всплеск трафика не перегружает сервер.
На новостном сайте кеш тоже крайне эффективен: самую читаемую статью открывают тысячи раз в одном и том же виде. Даже при времени жизни кеша в одну-две минуты число вызовов PHP на популярной странице сокращается в разы.
Когда кеш не помогает, а вредит
Страницы, которые выглядят по-своему для каждого пользователя, кешировать нельзя. Корзину, оформление заказа, личный кабинет, админку и страницы для авторизованных пользователей обязательно исключают из кеша. Иначе корзина или имя одного покупателя могут показаться другому. Также не кешируются POST-запросы, то есть отправка форм.
Для страниц, содержимое которых меняется ежесекундно, например курсов валют или живых результатов, время жизни кеша должно быть очень коротким, либо кеш не используется вовсе. Во внутренних системах, CRM и учебных платформах, где почти все работают под своей учётной записью, полностраничный кеш почти бесполезен. Там эффективнее object cache и оптимизация базы.
Настройка через fastcgi_cache в Nginx
Если на вашем VPS работают Nginx и PHP-FPM, полностраничный кеш можно настроить без плагинов, на уровне веб-сервера. Сначала в блоке http задаются место хранения и ключ кеша:
fastcgi_cache_path /var/cache/nginx/fcgi levels=1:2 keys_zone=PAGECACHE:100m inactive=60m max_size=1g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
Затем в блоке server сайта определяется, какие запросы не кешировать. Пример ниже содержит типичные исключения для WordPress и WooCommerce:
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/wp-admin/|/wp-login.php|/cart/|/checkout/|/my-account/") { set $skip_cache 1; }
if ($http_cookie ~* "wordpress_logged_in|wp-postpass|comment_author|woocommerce_items_in_cart") { set $skip_cache 1; }
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_cache PAGECACHE;
fastcgi_cache_valid 200 301 10m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache-Status $upstream_cache_status;
}
Создайте каталог для кеша, проверьте конфигурацию и перезагрузите Nginx. Путь к сокету должен соответствовать версии PHP на вашем сервере:
sudo mkdir -p /var/cache/nginx/fcgi
sudo nginx -t
sudo systemctl reload nginx
Как проверить, что кеш работает
Приведённая конфигурация добавляет к каждому ответу заголовок X-Cache-Status. Если запросить одну страницу дважды подряд, в первый раз вы увидите MISS, во второй — HIT:
curl -sI https://example.uz/ | grep -i x-cache-status
curl -sI https://example.uz/ | grep -i x-cache-status
Если на страницах корзины и кабинета выводится BYPASS, исключения работают правильно. Полезно также открыть сайт в одном браузере под своей учётной записью, а в другом — как гость: во втором окне не должно быть ни панели администратора, ни вашего имени.
Обновление кеша и выбор времени жизни
Самая тонкая часть кеширования — обновление. Сколько времени будет видна старая версия после изменения контента, зависит от срока жизни кеша. Короткий срок, например несколько минут, почти всегда даёт свежие данные и при этом сохраняет большой выигрыш на популярных страницах. Длинный срок сильнее разгружает сервер, но тогда нужен механизм ручной или автоматической очистки кеша при редактировании записей. Плагины кеширования для WordPress обычно сами очищают нужные страницы при обновлении записи, а для кеша Nginx эту задачу выполняет специальный плагин или скрипт, очищающий каталог кеша.
В магазине, где цены меняются часто, для карточек товаров можно задать короткий срок, а для главной страницы и статей — подлиннее. Определяйте время жизни каждой группы страниц по тому, как часто обновляется контент, и обязательно проверяйте результат после изменений.
Полностраничный кеш на виртуальном хостинге
На общем хостинге настройки веб-сервера изменить нельзя, поэтому полностраничный кеш обычно реализуют плагинами CMS. Они сохраняют готовые страницы на диске как статические файлы и отдают их при следующих запросах. Это тоже даёт ощутимое ускорение, особенно для посещаемого блога или корпоративного сайта. Какие способы кеширования поддерживаются на хостинге sayt.uz, можно уточнить в кабинете или через техподдержку. Какой бы способ вы ни выбрали, правило исключать корзину, кабинет и формы из кеша остаётся неизменным.