Настройка кэша Nginx FastCGI для снижения времени отклика сервера WordPress

В этом руководстве я объясню, как настроить кэширование Nginx FastCGI, чтобы сократить время отклика сервера на вашем сайте WordPress.

Кэширование Nginx FastCGI — это механизм, позволяющий сохранять и повторно использовать результаты обработки запросов от PHP и других FastCGI-приложений. Благодаря этому серверу не нужно каждый раз обрабатывать одни и те же данные, что значительно ускоряет загрузку страниц и снижает нагрузку на сервер.

Если вы использовали мои предыдущие инструкции по установке стека LEMP на разных дистрибутивах Linux, то Nginx уже настроен на передачу PHP-запросов в PHP-FPM, так как сам Nginx не способен обрабатывать PHP-код. Давайте разберемся, как функционирует сайт на базе стека LEMP.

  1. Веб-браузеры направляют HTTP-запросы на сервер Nginx, который осуществляет попытку загрузки страницы из файловой системы.
  2. Когда Nginx обнаруживает PHP-коды на странице, он перенаправляет запрос на PHP-FPM для выполнения этих кодов.
  3. При необходимости PHP-FPM обращается к базе данных MySQL или MariaDB для получения нужной информации.
  4. PHP-FPM создает статическую HTML-страницу, которая затем передается серверу Nginx для дальнейшей обработки.
  5. В конечном итоге Nginx передает статическую HTML-страницу в браузер.

Nginx демонстрирует отличную скорость при обработке статических HTML-страниц. В то же время PHP обычно ассоциируется с медленной работой, хотя в последней версии PHP8 наблюдается значительное ускорение по сравнению с предыдущими выпусками. Также база данных MySQL/MariaDB может стать еще одной проблемной точкой в производительности сайтов, построенных на стеке LEMP.

Вместо передачи запроса на динамическую страницу в PHP-FPM, который каждый раз создает HTML-страницу, Nginx способен кэшировать уже сгенерированные страницы. Это позволяет в следующий раз отправлять кэшированные версии напрямую в веб-браузеры, избегая лишних обращений к PHP и базе данных.

  • Это может существенно повысить скорость отклика сервера и уменьшить нагрузку на PHP-FPM и базу данных.
  • Это также дает возможность Nginx предоставлять веб-страницы из кэша, даже если сервер upstream PHP-FPM или база данных отключены (обычно MySQL/MariaDB является первым процессом, который прекращает работу, когда на вашем сервере Linux заканчивается память).

FastCGI представляет собой протокол, который используется для взаимодействия между Nginx и PHP-FPM, именно поэтому кэш называется кэшем FastCGI.

Настройка кэша FastCGI в Nginx.

Шаг 1: Внесите изменения в главный конфигурационный файл Nginx.

Измените главный конфигурационный файл Nginx.

sudo nano /etc/nginx/nginx.conf

В рамках HTTP вставьте следующие две строки:

fastcgi_cache_path /usr/share/nginx/fastcgi_cache levels=1:2 keys_zone=phpcache:100m max_size=10g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri";

путь к кэшу fastcgi в nginx

Первая директива fastcgi_cache_path отвечает за создание кэша FastCGI. Она может использоваться исключительно в контексте конфигурационного файла Nginx для http.

  • Первый аргумент определяет путь к кэшу в файловой системе ( /usr/share/nginx/fastcgi_cache/ ).
  • Параметр levels регулирует структуру директорий с двумя уровнями в пути /usr/share/nginx/fastcgi_cache/. Из-за того, что большое количество файлов в одной папке может ухудшить скорость доступа, рекомендуется применять двухуровневую организацию директорий для большинства установок. Если параметр levels не задан, Nginx размещает все файлы в одной папке. Имя первой директории состоит из одного символа, а поддиректория содержит два символа в названии.
  • Третий аргумент обозначает название зоны общей памяти (phpcache) и её объём (100 МБ). Эта память предназначена для хранения ключей кэша и связанных метаданных, например, времени их использования. Наличие ключей в памяти позволяет Nginx быстро определять, является ли запрос HIT или MISS, избегая обращения к дисковым хранилищам, что существенно ускоряет процесс проверки. Зона объёмом 1 МБ может хранить информацию примерно для 8,000 ключей, следовательно, зона в 100 МБ способна вместить данные для порядка 800,000 ключей.
  • Параметр max_size задает максимальный объем кэша, который в данном случае составляет 10 ГБ. Если данный параметр не установлен, кэш имеет возможность занимать все свободное пространство на диске. Когда объем кэша достигает установленного предела, менеджер кэша Nginx начинает удалять наименее востребованные файлы.
  • Информация, не запрашиваемая в течение 60 минут бездействия, будет удалена из кэша кэш-менеджером, независимо от срока её действия. Значение по умолчанию — 10 минут. Также доступны другие значения, например, 12h (12 часов) и 7d (7 дней).
  • Nginx сначала сохраняет файлы, которые должны быть закэшированы, в временной папке (/var/lib/nginx/fastcgi/). Установка параметра use_temp_path=off позволяет Nginx сразу записывать их в целевую директорию кэша, тем самым исключая излишние операции копирования между файловыми системами.
Читайте также:  Как настроить и использовать общие папки в Linux для совместного доступа к файлам

Вторая директива fastcgi_cache_key задает уникальный ключ для доступа к кэшу. Nginx применяет функцию хеширования MD5 к этому ключу, а полученный хеш используется в качестве имени файлов кэша. После добавления обеих директив в контекст http, сохраните изменения и закройте файл.

Этап 2: Настройка конфигурации сервера Nginx.

После этого откройте файл конфигурации вашего серверного блока.

sudo nano /etc/nginx/conf.d/your-domain.conf

Прокрутите вниз до раздела с местоположением.~Добавьте указанные строки в эту часть кода.

fastcgi_cache phpcache; fastcgi_cache_valid 200 301 302 60m; fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; add_header X-FastCGI-Cache $upstream_cache_status;

Настройка кэширования FastCGI в Nginx

  • Директива fastcgi_cache активирует кэширование, опираясь на память, заданную ранее через директиву fastcgi_cache_path.
  • Директива fastcgi_cache_valid задает продолжительность кэширования в зависимости от HTTP-кодов состояния. В указанном примере ответы с кодами 200, 301 и 302 будут храниться в кэше на протяжении 60 минут. Также можно применять временные форматы, такие как 12h (12 часов) и 7d (7 дней).
  • Nginx способен выдавать устаревшие данные из кэша в тех случаях, когда не удаётся получить актуальное содержимое от сервера PHP-FPM, например, если сервер баз данных MySQL/MariaDB временно недоступен. Вместо отправки ошибок пользователям, Nginx может предоставить устаревшую версию файла из своего кэша. Для активации этой функции мы ввели директиву fastcgi_cache_use_stale.
  • Параметр fastcgi_cache_min_uses определяет, сколько раз элемент должен быть запрошен пользователями, прежде чем Nginx начнет его кэшировать. Стандартное значение этого параметра составляет 1.
  • При активированном fastcgi_cache_lock, когда несколько пользователей пытаются получить файл, отсутствующий в кэше, только первый запрос обрабатывается сервером PHP-fpm.Остальные запросы остаются в ожидании, пока не завершится обработка первого, после чего они получают файл из кэша. Если же fastcgi_cache_lock не включен, все запросы направляются напрямую к серверу PHP-FPM.
  • Третий элемент включает заголовок X-FastCGI-Cache в HTTP-ответ, который позволяет определить, был ли запрос выполнен из кэша FastCGI.

Теперь сохраните изменения и закройте файл настройки серверного блока. После этого проверьте свою конфигурацию Nginx.

sudo nginx - t

После успешного завершения теста выполните перезагрузку Nginx.

sudo service nginx reload

sudo systemctl reload nginx

Теперь запустится менеджер кэша, и каталог для кэша (/usr/share/nginx/fastcgi_cache) будет создан автоматически.

Проверка кэширования в Nginx FastCGI.

Обновите главную страницу вашего сайта несколько раз, после чего примените curl для получения заголовков HTTP-ответа.

curl - I http://www. your-domain.com

тест кэша fastcgi в nginx

Обратите внимание на заголовок X-FastCGI-Cache. Значение HIT означает, что ответ был извлечён из кэша.

Если у вас постоянно возникает статус кэша MISS, возможно, стоит добавить следующую строку в конфигурационный файл Nginx.

Читайте также:  Настройка локального DNS-сервера на Ubuntu 24.04 с использованием BIND9

fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

fastcgi_cache phpcache; fastcgi_cache_valid 200 301 302 60m; fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; fastcgi_игнорировать_заголовки Cache-Control Expires Set-Cookie; add_header X-FastCGI-Cache $upstream_cache_status;

Некоторые пользователи могли активировать HTTPS в Nginx, однако разместили соответствующий код в секции HTTP-сервера (listen 80;), а не в секции HTTPS-сервера (listen 443 ssl;). Без добавления кода в блок HTTPS-кэша FastCGI работать не будет.

Элементы, которые не подлежат кэшированию

Входная сессия, пользовательские куки, POST-запросы, URL-строка, админ-панель WordPress, карта сайта, а также ленты и авторы комментариев не подлежат кэшированию. Для деактивации кэширования для этих компонентов необходимо внести изменения в конфигурационный файл вашего серверного блока. Поместите следующий код в контекст сервера, перед строкой location.~ \.php$.

установите $skip_cache в 0; # POST-запросы и URL с параметрами всегда обрабатываются через PHP, если ($request_method = POST)< set $skip_cache 1; >если ($query_string != «»)< set $skip_cache 1; >Не сохранять в кэше URI, которые содержат указанные сегменты.~

  • «/wp-admin/|/xmlrpc.php|wp-..php|^/feed/|/tag/./feed/|index.php|/.sitemap..(xml|xsl)»
  • < set $skip_cache 1; >Не применять кэш для пользователей, которые вошли в систему, или для тех, кто оставил комментарии недавно, если ($http_cookie~

  • «автор_комментария|wordpress_[a-f0-9]+|wp-постпароль|wordpress_без_кэша|wordpress_вошедший»
  • Иногда мне нужно проверить время отклика upstream (PHP-FPM и MariaDB), поэтому я добавляю следующие строки, чтобы заставить Nginx игнорировать кэш FastCGI для моих IP-адресов.

    К сожалению, текст, который вы предоставили, недостаточно полон для перефразирования. Пожалуйста, предоставьте более длинный или полный фрагмент текста.~* «12.34.56.78|12.34.56.79«)

    Символ тильда (~)~Символ ) указывает серверу Nginx, что далее будет представлено регулярное выражение (regex). Звездочка * делает это выражение нечувствительным к регистру. Вертикальная черта | используется для указания альтернативы между несколькими значениями. Если переменная $remote_addr соответствует любому IP-адресу, указанному в регулярном выражении, то значение переменной $skip_cache устанавливается в 1.

    Вы также можете исключить кэш для локальной сети, как показано ниже, что позволит добавить сеть 10.10.10.0/24 в список исключений.

    К сожалению, текст, который вы предоставили, недостаточно полон для перефразирования. Пожалуйста, предоставьте более длинный или полный фрагмент текста.~* «12.34.56.78|12.34.56.79|10.10.10..*»)

    Имейте в виду, что при использовании плагина Google XML Sitemap на вашем сайте WordPress, вы, скорее всего, обнаружите указанные ниже правила переписывания в настройках Nginx.

    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php? xml_sitemap=params=$2" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php? xml_sitemap=params=$2;zip=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php? xml_sitemap=params=$2;html=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php? xml_sitemap=params=$2;html=true;zip=true" last;

    Правила переписывания необходимо расположить ниже правил исключения кэша. Если они будут находиться выше, то ваша карта сайта всегда окажется в кэше. То же самое касается и плагина Yoast SEO: если вы его используете для создания карты сайта, правила переписывания Yoast также следует переместить ниже правил исключения кэша.

    Теперь в разделе местоположение~Для файлов с расширением.php добавьте следующие директивы.

    fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache;

    Если параметр $skip_cache установлен в 1, то первая директива инструктирует Nginx отправить запрос на сервер upstream PHP-FPM, вместо того чтобы искать файлы в кэше. Вторая директива предписывает Nginx не кэшировать ответ. После внесения изменений сохраните файл и перезапустите Nginx.

    sudo systemctl reload nginx

    sudo service nginx reload

    Способы автоматической очистки кэша в WordPress.

    Сначала вам нужно установить и активировать плагин Nginx Helper на вашем сайте WordPress. Затем перейдите в Настройки WordPress ->Включите Nginx helper и отметьте опцию «Включить очистку». Стандартные условия для очистки обычно подходят для большинства блогов на WordPress. Вы также можете активировать ведение журналов, чтобы убедиться, что процесс очистки функционирует корректно.

    очистка кеша fastcgi в nginx для wordpress

    Нажмите на кнопку «Сохранить все изменения».

    Читайте также:  Эффективные способы поиска файлов в Linux для начинающих и опытных пользователей

    Далее необходимо установить модуль http-cache-purge на сервере под управлением Linux. Для установки на Ubuntu 18.04 и более поздние версии выполните следующую команду. Во время установки файл конфигурации будет размещен в директории /etc/nginx/modules-enabled/, что позволит активировать этот модуль.

    sudo apt install libnginx-mod-http-cache-purge

    Вы можете установить пакет nginx-extras, чтобы активировать данный модуль, однако этот пакет содержит множество других модулей. Чтобы сделать мой Nginx максимально легким, я предпочитаю не устанавливать пакет nginx-extras.

    Откройте файл конфигурации сервера Nginx и внесите следующие строки в секцию сервера.<. >.

    location ~ /purge(/.*)

    Сохраните изменения в файле и закройте его. После этого проверьте настройки Nginx.

    sudo nginx - t

    При успешном завершении теста перезапустите Nginx.

    sudo systemctl reload nginx

    Теперь у вас есть возможность отредактировать один из ваших записей в WordPress и проверить, произойдет ли автоматическая очистка кэша.

    Плагин Nginx Cache Sniper

    Если плагин Nginx helper не работает, вы также можете использовать плагин Nginx Cache Sniper на вашем сайте WordPress. Установите плагин, затем перейдите в Панель управления WordPress -> Инструменты ->Nginx Cache Sniper для его конфигурации.

    Nginx кэш-снайпер для WordPress

    Как заранее сохранить кэш

    Вы можете подготовить кэш страницы заранее, до прихода пользователей на ваш сайт. Кэширование Nginx FastCGI не предлагает возможности предварительной загрузки кэша. Тем не менее, вы можете воспользоваться утилитой wget на другом сервере для загрузки всего сайта, что позволит Nginx создать кэш для каждой отдельной веб-страницы.

    wget - m - p - E - k https://www. yourdomain.com/

    Проверьте, чтобы IP-адрес другого сервера не оказался в списке исключений. Wget создаст папку www.yourdomain.com и разместит в ней загруженные данные.

    Иногда возникает необходимость очистить кэш Nginx FastCGI и позволить ему обновиться, но мне не хочется каждый раз вручную запускать команду wget. Поэтому я настраиваю Cronjob для автоматизации этого процесса.

    crontab - e

    В конце файла crontab добавьте следующую строку. Директория /tmp/ramdisk/ представляет собой RAM-диск, который я настроил для хранения файлов. Таким образом, данные будут сохраняться в оперативной памяти, что позволит избежать быстрого износа моего SSD.

    @hourly rm /tmp/ramdisk/www. yourdomain.com/ - rf ; wget --mirror --page-requisites --convert-links --directory-prefix=/tmp/ramdisk/https://www. yourdomain.com/

    Сохраните файл и закройте его. (Понимаю, что это не самый оптимальный вариант, но он работает.)

    Настройка кэша FastCGI для нескольких сайтов на платформе WordPress.

    Если на одном сервере у вас имеется несколько установок WordPress, вы можете настроить отдельный кэш FastCGI для каждого из этих сайтов.

    sudo nano /etc/nginx/nginx.conf

    fastcgi_cache_path /usr/share/nginx/domain1_fastcgi_cacheуровни=1:2 зона_ключей=domain1max_size=10g inactive=60m use_temp_path=off; путь к кэшу FastCGI: /usr/share/nginx/ max_size=100mdomain2_fastcgi_cacheуровни=1:2 зона_ключей=domain2:100m max_size=10g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri";

    Каждый сайт на WordPress имеет свою собственную зону ключей. В представленном выше коде выделены две зоны ключей: domain1 и domain2. Теперь для домена domain1 необходимо настроить файл виртуального хоста Nginx.

    location ~ \.php$ < fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include snippets/fastcgi-php.conf; fastcgi_cache domain1; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache_valid 200 301 302 60m; fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; add_header X-FastCGI-Cache $upstream_cache_status; > location ~ /purge(/.*) < fastcgi_cache_purge domain1 "$scheme$request_method$host$1"; >

    Файл виртуального хоста Nginx для domain2 должен быть настроен следующим образом:

    location ~ \.php$ < fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include snippets/fastcgi-php.conf; fastcgi_cache domain2; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache_valid 200 301 302 60m; fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; add_header X-FastCGI-Cache $upstream_cache_status; >location ~ /purge(/.*) < fastcgi_cache_purge domain2 "$scheme$request_method$host$1"; >

    Следующий этап.

    Надеюсь, данный материал оказался полезным для настройки кэша FastCGI в Nginx для WordPress. Кроме того, вы можете воспользоваться Nginx Amplify для отслеживания эффективности работы стека LEMP.

    • Мониторинг эффективности стека LEMP с использованием Nginx Amplify на Ubuntu версии 18.04/16.04.

    Для обеспечения безопасности вашего сайта вы можете установить веб-файрвол ModSecurity, который поможет защитить ваш WordPress от возможных взломов.

    • Настройка ModSecurity для Nginx на системах Debian/Ubuntu.

    Кроме того, можно применить модуль Nginx PageSpeed для повышения производительности фронтенд-части сайта.

    • Инсталляция модуля Nginx PageSpeed на сервер с операционной системой Ubuntu 20.04/18.04.

    Если этот пост оказался для вас полезным, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать еще больше советов и лайфхаков.