Технология асинхронных врезок совместно с использованием кэширования средствами веб-сервера позволяет многократно снизить нагрузку на веб-сервер и значительно ускорить отдачу страниц посетителям сайта.
Смысл данного приёма состоит в разделении общего контента (например, каталога товаров) и контента, который генерируется для конкретного пользователя (например, корзины). Общий контент кэшируется веб-сервером на указанное в настройках веб-сервера время в виде статических файлов, благодаря чему отдаётся клиенту очень быстро и с минимальной нагрузкой на сервер.
1. Идентификация фрагментов страниц, которые могут отличаться для разных посетителей сайта, и их замена на асинхронные врезки с отложенной загрузкой.
Макет дизайна готовых интернет-магазинов, доступных для установки через панель управления Netcat, имеет настройку «Загружать динамическую часть макета отдельным запросом» (вкладка «Оформление» в настройках сайта, блок «Настройки макета дизайна»), при включении которой динамические блоки макета будут загружаться после загрузки основной части страницы.
2. Определение списка страниц, которые никогда не должны кэшироваться веб-сервером (страница оформления заказа, личный кабинет и т. п.).
3. Конфигурирование веб-сервера.
4. ...
5. Profit!
(См. также: базовая конфигурация nginx без кэширования для Netcat.)
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:64m max_size=10240m inactive=15m;
server { server_name your-site.ru; # имя хоста set $home_path /usr/local/www/my-site.ru/; # корневой каталог сайта на сервере error_page 404 = /netcat/require/e404.php; location / { root $home_path; index index.php; if (!-e $request_filename) { rewrite ^(.+)$ /netcat/require/e404.php?REQUEST_URI=$1 last; } } # ----- Условия кэширования ----- set $no_cache 0; # флаг пропуска кэширования # не кэшировать запросы по следующим путям: if ($uri ~ "/netcat/") { set $no_cache 1; # обязательно! } if ($uri ~ "/cart/") { set $no_cache 1; } if ($uri ~ "/my/") { set $no_cache 1; } # ----- Параметры для PHP-скриптов ----- # http://nginx.org/ru/docs/http/ngx_http_fastcgi_module.html location ~ \.php$ { root $home_path; include fastcgi_params; fastcgi_pass 127.0.0.1:9000; # PHP-скрипты выполняет сервер FastCGI (127.0.0.1:9000) fastcgi_param SCRIPT_FILENAME $home_path$fastcgi_script_name; fastcgi_cache microcache; fastcgi_cache_key "$request_method|$host|$request_uri|$http_if_modified_since|$http_if_none_match"; fastcgi_cache_lock on; fastcgi_ignore_headers "Cache-Control" "Expires"; # кэширование независимо от заголовков, выставляемых session_start() fastcgi_no_cache $no_cache; # не кэшировать, если установлена $no_cache (см. выше) fastcgi_cache_bypass $no_cache; # не брать из кэша, если установлена $no_cache (см. выше) fastcgi_cache_valid 10m; # кэшировать результаты на 10 минут (для ответов 200, 301 и 302) fastcgi_cache_min_uses 1; } }
nginx не кэширует страницы с заголовком X-Accel-Expires: 0
. Эту особенность можно использовать для управления кэшированием на стороне веб-сайта:
<?php // запрет кэширования страницы nginx’ом header("X-Accel-Expires: 0");
Стандартные шаблоны компонентов товаров на готовых сайтах интернет-магазинов устанавливают такой заголовок, если цена товара зависит от каких-либо прошлых действий пользователя (проверка осуществляется методом nc_netshop_item::price_depends_on_user_data()
). Таким образом, если на сайте есть скидки, зависящие, например, от общей стоимости товаров в корзине, суммы предыдущих покупок и т. п., страницы с соответствующими товарами не будут кэшироваться веб-сервером.
Также при настройках по умолчанию не кэшируются страницы, на которых устанавливаются cookies (из соображений безопасности).