реклама
разместить

Использование Nginx FastCGI Cache

FastCGI Cache — это система кэширования данных реализованая на уровне HTTP-сервера Nginx.

Преимущество FastCGI Cache заключается в том, что Nginx вернёт закешированный ответ пользователю сразу, как только получит запрос, при этом слой приложения не будет вовсе обрабатывать поступивший на сервер HTTP-запрос, если он имеется в кэше Nginx.

Использование FastCGI Cache — отличный способ снизить нагрузку на вашу систему.

Если на вашем сайте есть страницы, которые изменяются редко или задержка обновления данных на некоторое время не критична, то FastCGI Cache именно то, что нужно.

Схема работы Nginx FastCGI Cache

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

Nginx FastCGI Cache
Nginx FastCGI Cache

Задача

Предположим у нас есть web-система управления полётом на луну, которая написана на PHP. Каждый пользователь должен ввести свой логин и пароль, чтобы войти в систему и оказаться на главной странице космического приложения.

Главная страница нашего ресурса, на которую попадают пользователи прошедшие этап аутентификации, очень популярная. Все пользователи ежедневно многократно просматривают эту страницу. На ней выводится большое количество всевозможных данных. Чтобы сгенерировать эту страницу требуется выполнить порядка тридцати SQL-запросов в различные базы данных.

Важно отметить, у пользователей данные, которые они видят на главной странице могут отличаться.

Нам известно, что информация, которая выводится на этой странице может обновляться с задержкой в один час. Данные не потеряют свою ценность даже есть они немного устареют.

Что из этого следует?

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

— До ввода логина и пароля и после этого главная страница системы выглядит по-разному. Не прошедшие аутентификацию пользователи видят только форму для входа в систему.

— Мы можем хранить данные в кэше в течение 1 часа.

Решение

Изначально наш виртуальных хост сконфигурирован следующим образом:

http { map $status $loggable { ~^[23] 0; default 1; } include /etc/nginx/mime.types; server { listen 80; index index.php index.html; server_name moon-flight.aero; error_log /var/log/nginx/moon-flight.aero.error.log; access_log /var/log/nginx/moon-flight.aero.access.log combined if=$loggable; root /var/www/moon-flight.aero/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; } } }

Первое, что мы сделаем добавим директиву fastcgi_cache_path в в контексте http.

fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=fastcgicache:10m inactive=70m max_size=512m;

Первый аргумент /tmp/nginx_cache определяет место на сервере, где будет сохранён кэш. Папка /tmp нам подходит, так как она очищается автоматически при перезапуске сервера. Важно отметить, что всё, что будет хранится в /tmp/nginx_cache так же будет находится в оперативной памяти.

Второй аргумент — это уровень подпапок. Мы указали levels=1:2. Это означает, что уровень вложенности будет равняться 2.Нас это устраивает, так как в одной папке у нас не будет большого количества файлов, а значит и замедление доступа к файлам нам не грозит.

Третий аргумент — имя зоны разделяемой памяти кэша. Запись keys_zone=fastcgicache:10m означает, что названием зоны является fastcgicache, а 10m — это размер зоны в мегабайтах. Зона размеров в 10 Мб может хранить данные для примерно 80 000 ключей. Конечно, название зоны может быть другим.

Четвёртый аргумент — inactive=70m, определяет интервал времени, после истечении которого данные автоматически удаляются, в случае, если они не используются. Другими словами, если к данным кэша не обращаются в течение времени, заданного параметром inactive, то данные удаляются, независимо от их свежести. По умолчанию inactive равен 10 минутам.

Пятый аргумент max_size=512m — устанавливает верхний предел размера кэша. По умолчанию используется всё дисковое пространство. При достижении лимита, Nginx удалит наименее востребованные данные.

Далее мы должны задать ключ для кэширования данных. Это можно сделать при помощи директивы fastcgi_cache_key. Данная директива может быть указана в контекстах http, server и location.

Укажим в контексте server директиву fastcgi_cache_key:

fastcgi_cache_key "$scheme$request_method$host$request_uri$cookie_codeAuth";

Здесь мы указали несколько переменных:

$scheme

$request_method

$host

$request_uri

$cookie_codeAuth

Давайте разберёмся с ними подробнее. Нам важно понимать, какие значения будут принимать эти переменные.

Рассмотрим пример, допустим залогиненный пользователь указал в браузере такой запрос:

http://moon-flight.aero/search/?query=10

После выполнения этого запроса Nginx присвоит следующие значения нашим переменным:

$scheme = http

$request_method = GET

$host = moon-flight.aero

$request_uri = /search/?query=10

$cookie_codeAuth будет иметь значение параметра Cookie codeAuth, который был передан браузером в заголовках запроса. В нашем случае у каждого пользователя, который успешно прошёл процедуру аутентификации в Cookie имеется переменная codeAuth. Эта переменная определяет активную сессию аутентификации.

В заголовке HTTP-запроса присутствует такая строка:

Cookie: codeAuth=a7e30fbb7f4513redfd22049c6b5dzme306f4e;

Ключ "$scheme$request_method$host$request_uri$cookie_codeAuth" даёт нам возможность для каждого пользователя сформировать свой собственный кэш. Значение переменной $cookie_codeAuth для каждого залогиненного пользователя будет уникальным.

Двигаемся дальше.

Теперь нам нужно описать условия работы кэша в контексте server и определить директивы fastcgi_cache, fastcgi_cache_valid, fastcgi_cache_bypass и fastcgi_no_cache в контексте location.

Опишем условия работы нашего кэша в контексте server.

Мы ходим кэшировать:

  • Только главную страницу, то есть переменная $request_uri должна иметь значение "/".
  • Запросы типа GET и никакие другие. Следовательно значение переменной $request_method должно равняться GET.
  • Только те запросы, в которых нет GET параметров. Значит переменная $query_string должна содержать пустую строку "".

Эти 3 условия мы запишем так (в контексте server):

set $no_cache 0; if ($request_method != GET) { set $no_cache 1; } if ($query_string != "") { set $no_cache 1; } if ($request_uri != "/") { set $no_cache 1; }

Теперь определим директивы fastcgi_cache, fastcgi_cache_valid, fastcgi_cache_bypass и fastcgi_no_cache в контексте location.

fastcgi_cache fastcgicache; fastcgi_cache_valid 200 60m; fastcgi_cache_bypass $no_cache; fastcgi_no_cache $no_cache;

Что значат эти директивы?

fastcgi_cache — задаёт название зоны разделяемой памяти, используемой для кэширования. Название зоны мы указывали ранее в директиве fastcgi_cache_path.

fastcgi_cache_valid — задаёт время кэширования HTTP-кода ответа. В нашем случае мы установили время равно 60 минут для кода 200.

fastcgi_cache_bypass — задаёт условие, при котором ответ не будет браться из кэша. Если значение непустое или не равно 0, то ответ не берётся из кэша.

fastcgi_no_cache — задаёт условия, при котором ответ не будет сохраняться в кэш. Если значение непустое или не равно 0, то ответ не будет сохранён в кэше.

Файл конфигурации можно сохранить и выполнить команду:

sudo service nginx reload

Всё должно работать.

Но как узнать, что данные кэшируются и мы получаем результат из кэша?

Очень просто. Нужно добавить специальный заголовок, и передать в него переменную $upstream_cache_status.

В секцию server добавим директиву add_header со следующими параметрами:

add_header x-fastcgi-cache $upstream_cache_status;

x-fastcgi-cache — это название нашего заголовка.

Переменная $upstream_cache_status может иметь следющие значения:

  • MISS
  • BYPASS
  • EXPIRED
  • STALE
  • UPDATING
  • REVALIDATED
  • HIT

Если страница получена из кэша, то вы увидите значение HIT.

Финальный файл конфигурации со всеми добавленными директивами будет выглядеть так:

http { map $status $loggable { ~^[23] 0; default 1; } include /etc/nginx/mime.types; fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=fastcgicache:10m inactive=70m max_size=512m; server { listen 80; index index.php index.html; server_name moon-flight.aero; error_log /var/log/nginx/moon-flight.aero.error.log; access_log /var/log/nginx/moon-flight.aero.access.log combined if=$loggable; root /var/www/moon-flight.aero/public; fastcgi_cache_key "$scheme$request_method$host$request_uri$cookie_codeAuth"; set $no_cache 0; if ($request_method != GET) { set $no_cache 1; } if ($query_string != "") { set $no_cache 1; } if ($request_uri != "/") { set $no_cache 1; } location / { try_files $uri $uri/ /index.php?$query_string; } add_header x-fastcgi-cache $upstream_cache_status; location ~ \.php$ { fastcgi_cache fastcgicache; fastcgi_cache_valid 200 60m; fastcgi_cache_bypass $no_cache; fastcgi_no_cache $no_cache; try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; } } }

Полезные команды

Проверить синтаксис файлов конфигурации Nginx можно следующей командой:

sudo nginx -t

Для того, чтобы изменения конфигурации вступили в силу, выполните:

sudo service nginx reload

Описание модуля ngx_http_fastcgi_module доступно по ссылке:

11
реклама
разместить
1 комментарий

Здравствуйте! Подскажите пожалуйста , какую свЯзку выбрать для Магазина на Wordpress, что бы отклик был самым быстрым

Играю я для души, а так у меня бизнес есть. Собрал 16 игр для прокачки навыков предпринимателя!

В следующий раз когда жена или мамка начнёт пилит тебя, что ты опять сидишь за компом и тратишь бесценное время, то вспоминай мои пост и утверждай, что это тренажер важных навыков для предпринимателя, основателя стартапа или менеджера продукта. И если вы ожидали тут увидеть сплошные экономические симуляторы, то это не так. Они конечно тоже будут, н…

Играю я для души, а так у меня бизнес есть. Собрал 16 игр для прокачки навыков предпринимателя!
1515
11
11
реклама
разместить
Я делаю масло самодельным гидравлическим прессом, получаю 100к и счастлив

Когда я начал продавать сыродавленное масло в Калининграде и столкнулся с трудностями, о которых даже не думал. У меня ощущение, что я работаю из Европы, хотя закупаюсь и продаю в России. Зарабатываю 100 тысяч в месяц и не могу нормально расширить бизнес, потому что конкурировать с другими регионами — практически нереально.

У них конструкция похожа на мясорубку или соковыжималку
2626
ТОП-5 бидеров для рекламы на Wildberries
ТОП-5 бидеров для рекламы на Wildberries

Если нужно быть в топе, еще и радоваться высоким продажам на Wildberries, подключение рекламы — не прихоть и роскошь, а насущная необходимость.

ЦБ обязал крупные банки с 1 октября 2025 года добавить в приложения функцию для жалоб на мошенников

Также можно будет получить справку для обращения в полицию.

88
11
День 1119: «Газпром» сообщил об убытке более чем в 1 трлн рублей в 2024 году по РСБУ

Собираем новости, события и мнения о рынках, банках и реакциях компаний.

Источник фото: «Банки.ру»
1919
44
44
11
11
Отправьте смс с кодом "яхта", на номер 0777 Помогите собрать Алеше на выплату дивидендов.
ФАС проверит наценки на продукты в «Яндекс Лавке» и «Самокате»

Антимонопольная служба изучит средневзвешенные закупочные и розничные цены.

Источник фото: Retail.ru
2020
1111
11
Когда ФАС заинтересуется ценообразованием тарифов на ЖКХ?
Что должен успеть сделать каждый российский предприниматель до 30 мая 2025 года

Уже поняли про что речь? Верно, про утечку. Если быть точнее, про утечку персональных данных из компании. Лет 10 назад это понятие не вызывало откровенно негативных чувств. С недавних пор оно неразрывно с тревогой и печалью, а буквально через полтора месяца уже будет навевать гнев и нести опустошение: не только эмоциональное, но и финансовое, ибо н…

Что должен успеть сделать каждый российский предприниматель до 30 мая 2025 года
1414
33
11
Курс доллара на рынке Forex опустился ниже 82 рублей впервые с июня 2024 года

Аналитики объясняют это улучшением отношений России и США и низким спросом на доллар у российских импортёров.

55
11
11
Прокорм 41 млн пенсионеров становится проблемой

Причем проблемой государственного масштаба. С одной стороны, мы имеем номинальный рост пенсий в 2024 году на 7.6% - то есть в рублях они формально выросли до 20 900 (в среднем по стране). С другой стороны, в реальном выражении (т.е. с поправкой на инфляцию) пенсии сократились на 0.8% и остались на уровне ниже 2013 (Карл! 2013-го!) года.

Прокорм 41 млн пенсионеров становится проблемой
55
реклама
разместить
Блогер «обдурил» старую систему Tesla Autopilot — она не распознала стену с фотографией пустой дороги

Поэтому автомобиль её протаранил.

2626
2020
11
11
11
Тут бы и человек не увидел разницы на скорости
Медианная зарплата московских курьеров на март 2025 года на 19% выше, чем у «специалистов с высшим образованием» — Superjob

И на 38% выше, чем у кадров без него.

Источник фото: ТАСС
6464
1313
88
44
33
22
- Ну как же Вы, учительница младших классов, с двумя высшими образованиями стали курьером? - Знаете - просто повезло!
Audi сократит до 7500 рабочих мест в Германии к 2029 году для уменьшения расходов

«Дочка» Volkswagen следует примеру материнской компании.

Источник: Audi
88
33
33
22
Санкции против России немцам только на пользу
[]