База знаний по Open Source
Yandex поиск по всему сайту
Авторизация

Как настроить Nginx FastCGI Cache для сокращения времени отклика сервера WordPress?

fastcgi caching

Обычно Nginx настроен на передачу PHP-запроса в PHP-FPM, поскольку сам Nginx не может обрабатывать PHP-код. Как же работает веб-сайт LEMP. LEMP расшифровывается как Linux (операционная система), Nginx (веб-сервер), MySQL (система управления базами данных) и PHP (серверный язык сценариев для обработки динамического контента).

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

При необходимости PHP-FPM запросит базу данных MySQL / MariaDB, чтобы получить то, что ему нужно. PHP-FPM генерирует статическую HTML-страницу, которая затем возвращается Nginx. Наконец, Nginx отправляет статическую HTML-страницу в веб-браузер.

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

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

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

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

Как настроить Nginx FastCGI Cache

 

Шаг 1: Отредактируйте основной файл конфигурации Nginx

sudo nano /etc/nginx/nginx.conf

В контексте http добавьте следующие 2 строки:

fastcgi_cache_path /etc/nginx/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_cache_path создает кэш FastCGI. Эта директива доступна только в контексте http файла конфигурации Nginx.

Первый аргумент указывает местоположение кэша в файловой системе (/etc/nginx /cache/). Параметр level устанавливает двухуровневую иерархию каталогов в /etc /nginx/cache/. Наличие большого количества файлов в одном каталоге может замедлить доступ к файлам, поэтому рекомендуется двухуровневый каталог для большинства развертываний. Если параметр level не включен, Nginx помещает все файлы в один каталог. Первый каталог использует один символ в своем имени. Подкаталог использует два символа в своем имени.

Третий аргумент указывает имя зоны разделяемой памяти (phpcache) и ее размер (100M). Эта зона памяти предназначена для хранения ключей кэша и метаданных, таких как время использования. Наличие копии ключей в памяти позволяет Nginx быстро определять, является ли запрос HIT или MISS без необходимости перехода на диск, что значительно ускоряет проверку. Зона 1 МБ может хранить данные для около 8000 ключей, поэтому в зоне 100 МБ могут храниться данные для около 800 000 ключей.

max_size устанавливает верхний предел размера кэша (в данном примере 10 ГБ). Если не указан, кэш может использовать все оставшееся дисковое пространство. Как только кэш достигнет своего максимального размера, диспетчер кэша Nginx удалит из кэша наименее используемые файлы.

Данные, которые не были доступны в течение неактивного периода времени (60 минут), будут удалены из кэша диспетчером кэша независимо от того, истек ли он или нет. Значение по умолчанию составляет 10 минут. Вы также можете использовать такие значения, как 12 часов (12 часов) и 7 дней (7 дней).

Сначала Nginx записывает файлы, предназначенные для кэша, во временную область хранения (/var/lib/nginx/fastcgi/). use_temp_path = off указывает Nginx записывать их непосредственно в конечный каталог кэша, чтобы избежать ненужного копирования данных между файловыми системами.

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

Шаг 2: Редактировать блок сервера Nginx

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

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

Прокрутите страницу вниз до раздела ~ .php $. Добавьте следующие строки в этот раздел:

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_cache включает кэширование, используя зону памяти, ранее созданную директивой fastcgi_cache_path.

Fastcgi_cache_valid устанавливает время кэширования в зависимости от кода состояния HTTP. В приведенном выше примере ответы с кодом состояния 200, 301, 302 будут кэшироваться в течение 60 минут. Вы также можете использовать период времени, например, 12 часов (12 часов) и 7 дней (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.

3-я строка добавляет заголовок X-FastCGI-Cache в ответ HTTP. Его можно использовать для проверки того, был ли обработан запрос из кэша FastCGI или нет.

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

sudo nginx -t

Если тест пройден успешно, перезагрузите Nginx.

sudo service nginx reload

или же

sudo systemctl restart nginx

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

Тестирование Nginx FastCGI Cache

Перезагрузите домашнюю страницу вашего сайта несколько раз. Затем используйте curl для получения заголовка ответа http.

nginx fastcgi cache test

Посмотрите на заголовок X-FastCGI-Cache. HIT указывает, что ответ был отправлен из кэша.

Отключение кэширования для некоторых страниц

Вход в систему, пользовательский файл cookie, запрос POST, строка запроса, серверная часть WordPress, карта сайта, каналы не должны кэшироваться. Не стоит кэш для зарегистрированных пользователей или недавних комментаторов. Чтобы отключить кэширование для указанных выше элементов, отредактируйте файл конфигурации блока вашего сервера. Вставьте следующий код в контекст сервера над строкой местоположения ~ .php $.

set $skip_cache 0;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}

# Don't cache uris containing the following segments
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*.(xml|xsl)") {
set $skip_cache 1;
}

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}

Стоит так-же добавть следующие строки, чтобы Nginx пропустил кэш FastCGI для ваших IP-адресов.

if ($remote_addr ~* "12.34.56.78|12.34.56.79") {
set $skip_cache 1;
}

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

Обратите внимание, что если вы используете плагин карты сайта Google XML на своем сайте 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 ниже правил пропуска кэша.

Теперь в разделе location ~ .php $ вставьте следующие директивы:

fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;

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

sudo systemctl reload nginx

или

sudo service nginx reload

Использованы материалы отсюда.