Кэширование PHP-FPM в nginx

Если у вас на сервере есть только nginx и он обрабатывает PHP с помощью PHP-FPM, то кэширование отдаваемого им контента настраивается ещё проще, чем в случае с проксированием (например, когда есть Apache на бэкенде) и сопряжено с меньшим количеством сложностей.

Итак, первым делом создаём каталог, в котором будет складываться кэш (либо убеждаемся, что он уже существует) и меняем владельца на того пользователя, под которым nginx работает:
mkdir -p /var/cache/nginx
chown -R nginx:nginx /var/cache/nginx

Далее, в /etc/nginx/nginx.conf в секции http указываем путь к созданному каталогу и ключ, по которому будут кэшироваться fastcgi-ответы от PHP-FPM:

http {
....
  fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=MYCACHE:10m inactive=4h;
  fastcgi_cache_key "$scheme$request_method$host$request_uri";
....
}

Вот тут внимательно — параметр keys_zone=MYCACHE:10m определяет имя зоны (мы будем его использовать далее в секции server, для которого будем настраивать кэширование, и этих имён может быть много, с разными настройками для разных случаев, либо, напротив, можно использовать одно и то же для разных сайтов), и размер пула для ключей, другими словами — максимальное количество возможных кэшированных запросов. Согласно официальной документации, для хранения 8 тысяч ключей достаточно 1 мегабайта, подбирайте из собственных нужд. А параметр inactive означает, что если к данным никто не обращался в течение указанного времени, они будут выброшены из кэша независимо от их свежести или других факторов.

Теперь всё, что нужно — отыскать location, в котором описана обработка PHP на нашем сайте, и указать как минимум 2 директивы:

location ~ \.php$ {
....
  fastcgi_cache MYCACHE; 
  fastcgi_cache_valid 200 4h;
....
}

Первая из них указывает на зону ключей, которую мы определили выше, вторая — выбирает, какой тип ответов и на какое время будет кэширован (в моём примере — кэшируются только 200-е ответы на 4 часа).
По большому счёту, этого уже достаточно для работы. Отдельно хочется отметить, что с приведёнными настройками не возникает проблем с WordPress и cookie при логине в административную часть сайта (в частности, не возникает ошибка «Cookies либо заблокированы, либо не поддерживаются вашим браузером. Чтобы использовать WordPress на хостинге, нужно разрешить cookies»).

4 thoughts on “Кэширование PHP-FPM в nginx

  1. Кэширование действительно добавляет скорости работы сайтам, убеждаюсь не первый раз на собственном опыте. Практически всегда пользуюсь апачем в бэкенде, но оказывается с одним NGINX все выходит даже проще в настройке, а это уже повод мне задуматься, ведь чем проще, тем надежнее.

  2. Кэширование в NGINX действительно забавная, простая и удобная штука, но в данной статье ничего не говорится о том, как принудительно можно удалить кэш, при необходимости, а точнее о том, что можно просто удалить папки кэша. Т.е. можно сделать доморощенную систему инвалидации кэш, когда происходит большое обновление или прошло кэширование чего-то ненужного, просто взять и очистить папки кэша.

  3. Я недавно работаю с WordPress, все делаю под админом. А как узнать пользователя, под которым работает nginx? Можно ли сделать, чтобы каталог для кэша создался автоматически под этим пользователем?

  4. Использовать NGINX реально проще. Мне лично было познавательно прочитать данную статью. Познавательно. Для меня непонятно как принудительно почистить кеш. С WordPress не работал но здесь для себя тоже прочитал интересную информацию. МикроМакс, удаление или чистка папки это хорошая идея ))