вызов map variable дважды

2013-08-15 Пенетрантность lekrus
Здравствуйте,

У меня используется переменная
map $v_host $backend {
 default 1;
 test  2;
 test2 3;
}

Далее идет 

location / {
 set $v_host test;
proxy_pass $backend #(тут переменная $backend правильно определяется, равна
2) 
}

в процессе, upstream возвращает X-Accel-Redirect который вызывает другой 
location /int {
internal; 
set $v_host test2;
rewrite (.*) $backend
}

и при таком вызове $backend остается равен 2, должен быть 3.

Я правильно понимаю, что в процессе одного вызова, если переменная map хоть
раз была вычислена, далее все остальные вызовы используют это значение,
независимо от того, меняется ли переменная, по которой определяется
значение?

Есть ли возможность как-то заставить перевычислить это значение?

Спасибо,
Алексей

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,241868,241868#msg-241868

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

Re: вызов map variable дважды

2013-08-15 Пенетрантность Ruslan Ermilov
On Thu, Aug 15, 2013 at 03:18:43AM -0400, lekrus wrote:
 Здравствуйте,
 
 У меня используется переменная
 map $v_host $backend {
  default 1;
  test  2;
  test2 3;
 }
 
 Далее идет 
 
 location / {
  set $v_host test;
 proxy_pass $backend #(тут переменная $backend правильно определяется, равна
 2) 
 }
 
 в процессе, upstream возвращает X-Accel-Redirect который вызывает другой 
 location /int {
 internal; 
 set $v_host test2;
 rewrite (.*) $backend
 }
 
 и при таком вызове $backend остается равен 2, должен быть 3.
 
 Я правильно понимаю, что в процессе одного вызова, если переменная map хоть
 раз была вычислена, далее все остальные вызовы используют это значение,
 независимо от того, меняется ли переменная, по которой определяется
 значение?

Правильно понимаете.  Определяться кстати она может не только
по одной переменной, а по произвольному выражению, содержащему
как строки, так и переменные.

 Есть ли возможность как-то заставить перевычислить это значение?

Можно, но только пропатчив nginx:

diff --git a/src/http/modules/ngx_http_map_module.c 
b/src/http/modules/ngx_http_map_module.c
--- a/src/http/modules/ngx_http_map_module.c
+++ b/src/http/modules/ngx_http_map_module.c
@@ -477,7 +477,7 @@ ngx_http_map(ngx_conf_t *cf, ngx_command
 }
 
 var-valid = 1;
-var-no_cacheable = 0;
+var-no_cacheable = 1;
 var-not_found = 0;
 
 vp = ngx_array_push(ctx-values_hash[key]);

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

Re: вызов map variable дважды

2013-08-15 Пенетрантность Andrey Kopeyko

15.08.2013 11:18, lekrus пишет:

Здравствуйте,

У меня используется переменная
map $v_host $backend {
  default 1;
  test  2;
  test2 3;
}

Далее идет

location / {
  set $v_host test;
proxy_pass $backend #(тут переменная $backend правильно определяется, равна
2)
}

в процессе, upstream возвращает X-Accel-Redirect который вызывает другой
location /int {
internal;
set $v_host test2;
rewrite (.*) $backend
}

и при таком вызове $backend остается равен 2, должен быть 3.

Я правильно понимаю, что в процессе одного вызова, если переменная map хоть
раз была вычислена, далее все остальные вызовы используют это значение,
независимо от того, меняется ли переменная, по которой определяется
значение?

Есть ли возможность как-то заставить перевычислить это значение?


Я бы посоветовал пользовать две мапы вместо одной.
Что содержимое у них будет одинаковое - так генератору конфига это без 
разницы.



--
Best regards,
Andrey Kopeyko and...@kopeyko.ru

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

Re: релоад конфига

2013-08-15 Пенетрантность Gena Makhomed

On 15.08.2013 13:09, Валентин Бартенев wrote:


Что искать в дебаг логе? Я не вижу там никаких признаков получения
сигнала, однако, например, посылание сигналов QUIT и TERM прекрасно
работает.


если включить отладочный лог - в нем видно получение сигналов
и что nginx делает дальше, после получения сигнала:

[notice] 2602#0: signal 1 (SIGHUP) received, reconfiguring
[notice] 2602#0: signal 15 (SIGTERM) received, exiting
[notice] 9580#0: signal 3 (SIGQUIT) received, shutting down



Ради этих сообщений и не нужно включать отладочный лог.  Достаточно уровня
логгирования notice или info.


ради этих - да.

но у топикстартера были обоснованные подозрения, что nginx сигнал HUP
получает, но потом почему-то правильным образом на него не реагирует.
debug нужен для ...что nginx делает дальше, после получения сигнала

--
Best regards,
 Gena

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

Re: релоад конфига

2013-08-15 Пенетрантность Vadim Lazovskiy
А нет ли где в логах  too many open files?


15 августа 2013 г., 3:30 пользователь Nick Knutov m...@knutov.com написал:

 ок, собрал то же, что было, с дебагом, нгинх заодним обновил до 1.5.3.

 Что искать в дебаг логе? Я не вижу там никаких признаков получения
 сигнала, однако, например, посылание сигналов QUIT и TERM прекрасно
 работает.

 14.08.2013 17:58, Gena Makhomed пишет:
  On 14.08.2013 14:02, Nick Knutov wrote:
  [...]
  Проблема на первом сервере стабильно воспроизводится.
 
  причину проблем может помочь понять отладочный лог:
  http://nginx.org/ru/docs/debugging_log.html
 
  параметр --with-debug много оверхеда не добавляет,
  но очень удобен при поиске причин различных проблем.
 

 --
 Best Regards,
 Nick Knutov
 http://knutov.com
 ICQ: 272873706
 Voice: +7-904-84-23-130

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




-- 
Best Regards,
Vadim Lazovskiy
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru