Как кешировать динамические данные в NGINX получаемые по API?
Есть интернет магазин, товары на сайте отображаются напрямую с API поставщика, включая фото товаров.
Проблема: скорость предоставления данных конечному пользователю, т.к. запрос проходит от пользователя к нашему серверу- с нашего сервера - на сервер поставщика и обратным путем уже конечному пользователю.
Также проблема с изображениями, сервер поставщика находится в другой стране.
1. Как можно кешировать (в файлах) описание товара и фото товаров, но не кешировать цену и отображать ее без кеша?
2. Можно ли кешировать на уровне nginx в бд(mariadb) ? или лучше файлами?
(Перенести все данные из api в бд - пока возможности нет)
Сомнительно, что это будет работать хорошо. Пользователь сначала увидит низкую цену от поставщика, а потом, когда и если сработает AJAX, то затем более высокую цену. :-(
Ромзес Панагиотис, nginx умеет заменять данные в html через https://nginx.org/ru/docs/http/ngx_http_sub_module.html
Вы можете внедрить в head некий стиль, который будет делать display:none у цены и некий скрипт который заберет эту цену аяксом и покажет блок.
Либо нужно делать более хитрое кеширование на своей стороне и каждый раз подменять цену на выдачу.
С изображениями легче всего: вы можете просто их кешировать, nginx может выступать как кеш-прокси.
Т.е. ссылаетесь на nginx, тот уже идет к себе на диск - если картинки нет (или она просрочена), то идет к поставщику.
По сути с ценой тоже самое можно сделать только на файлах.
Для получения цены вы обращаетесь к текстовому файлу, если он не просрочен -- nginx его отдает, если просрочен -- то nginx обращается к вашему скрипты, который выдерает цену откуда надо и отдает её в виде простого текста.
Есть SSI (можно им кэшировать всё, кроме блока страницы с ценой): https://habr.com/ru/post/428127/ Либо через JS цену выводить, либо как-то еще. По второму вопросу - nginx кэширует в файлы и это лучше, в БД не умеет и не надо это. Кэшировать изображения вообще не проблема, это типичный для nginx кейс ("кэширование статики" он называется, есть много разных вариантов).