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

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

> Наиболее простое решение - использовать отдельный location для 
> баннеров с отдельными же переменными.

Так и сделано
(https://forum.nginx.org/read.php?21,279356,279363#msg-279363):
location /banner/ { 
internal; 

fastcgi_cache banner; 
fastcgi_cache_valid 200 24h; 
fastcgi_cache_key '$uri$is_args$args'; 

set $handler banner.html; 
set $querystring $args; 

fastcgi_param REQUEST_URI $uri$is_args$args; 
fastcgi_param SCRIPT_NAME $uri$is_args$args; 
fastcgi_param PATH_INFO $uri$is_args$args; 

include parser; 
fastcgi_pass fcgiwrap; 
}

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

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

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,279356,279490#msg-279490

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить