Re: proxy_store и переменные

Maxim Dounin mdounin на mdounin.ru
Пн Фев 11 01:04:07 UTC 2019


Hello!

On Mon, Feb 11, 2019 at 12:40:53AM +0300, Vladimir Sopot wrote:

> Строим вот такой просто кэшер уменьшенной статики. Для простоты 
> добавляем это в nginx.conf.default
> 
> resolver 8.8.8.8;
> 
> server {
> 	listen *:80;
> 	server_name “~^cache-(\d).domain.ru$";
> 	set $store_id $1;

Так делать в сколько-нибудь сложных конфигурациях нельзя.

После любого внутреннего перенаправления - серверные rewrite'ы 
отрабатают заново, и "set" будет использовать $1 от последнего 
выполневшегося регулярного выражения.  И в вашем случае это будет 
совсем не регулярное выражение из server_name.

Если хочется вытаскивать какую-либо информацию из server_name - 
это надо делать с помощью named captures, как-то так:

   server_name ~^cache-(?<store_id>\d)\.domain\.ru$;

[...]

> Всё работает, ничего не кэшируется. Раскомментирую proxy-store и 
> получается ад: в $store_id попадает всё, что матчится (.+\.jpg) 
> и складывается в 
> '/wwwroot/domain.ru/cache-/path/to/original/jpg/request' 
> <http://domain.ru/cache-/path/to/original/jpg/request'>, 
> например. То есть $store_id почему-то перезаписывается следующим 
> $1. Почему так и как это исправить, кроме как делать отдельный 
> server{} для каждого $store_id?

См. выше.  Не надо использовать нумерованные выделения в 
сколько-нибудь сложных конструкциях.  В декларативном конфиге 
nginx'а предугадать, какое регулярное выражение было выполнено 
последним - редко когда возможно, и подчас их их использование 
ведёт к появлению проблем в самых неожиданных местах.

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


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