Re: Некорректный ответ при использовании fastcgi cache background update on

Maxim Dounin mdounin на mdounin.ru
Вт Апр 17 12:37:59 UTC 2018


Hello!

On Mon, Apr 16, 2018 at 04:52:20PM -0400, gz wrote:

> > Вопрос не в том, что используется в ключе кэширования, а в том, 
> > что отправляется на бэкенд. И на бэкенд у вас при перезаписи как 
> > раз отправляется $handler, установленный в другом подзапросе:
> 
> > 2018/04/09 21:29:34 [debug] 16867#16867: *1901 fastcgi param:
> "PATH_TRANSLATED: /var/www/site/www/banner.html"
> 
> Не совсем понимаю как результат работы подзапроса, пусть и с перезаписанными
> переменными окружения, может быть помещён в кэш основного запроса.
> Если кэши запроса и подзапроса разные (разные cache_path) да к тому же
> используют разные ключи кэширования.
> То есть, подзапрос баннера вдруг перезаписывает ответ всей страницы.

Это не подзапрос баннера.  Это подзапрос 
fastcgi_cache_background_update.  Но в нём используются те же 
переменные, что уже перезаписаны подзапросом баннера, и в 
результате на бэкенд уходит неправильное значение переменной 
PATH_TRANSLATED.  И бэкенд, в свою очередь, отвечает на него в 
соответствии с этим неправильным значением.

> То, куда попадёт ответ подзапроса зависит от PATH_TRANSLATED?

Нет.  Он неё зависит, что у вас отвечает бэкенд.

> > Бэкенд возвращает пустой ответ, и этот ответ попадает в кэш. То 
> > есть всё ровно так, как я и предполагал. Нужно исправлять 
> > конфигурацию так, чтобы запрос на бэкенд не использовал 
> > переменных, которые могут быть переписаны другими подзапросами.
> 
> Не уверен, что это возможно.
> FCGI-приложение требует этих переменных для своей работы.

Наиболее простое решение - использовать отдельный location для 
баннеров с отдельными же переменными.  Наиболее правильное - 
переписать логику так, чтобы нужные бэкенду значения вычислялись 
не с помощью set, а с помощью map { volatile; ... }.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru