nginx+redis+eval

Дмитрий Жильцов zaabjuda на gmail.com
Вс Мар 4 20:41:25 UTC 2012


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

Возникла у меня заминка при написания конфига.

Что имеем
1. Необходимо выполнять динамическое проксирование с url типа
http://site.com/dln/IDUSER/IDCONTENT на значение ключа
dlnIDUSER_IDCONTENT из redis'а
2.Пример URL http://site.com/dln/VASYA/1234576
                redis 127.0.0.1:6379> get dlnVASYA_1234576
                "http://192.168.0.12:8080/colorring/rl/097/0/2340/0500/242.mp3"
     Сщщответсвенно URL http://site.com/dln/VASYA/1234576 должен
проксироваться на
http://192.168.0.12:8080/colorring/rl/097/0/2340/0500/242.mp3

Был написан конфиг

 location ~ ^/dln/(?P<USERID>[^/]+)/(?P<IDCONTENT>[^/]+) {
                eval_escalate on;
                eval $dlnproxy {
                       set $dln        "dln";
                       set $dl         "_";
                       set $dlnKey     $dln$USERID$dl$IDCONTENT;
                       set $redis_key "$dlnKey";
                       redis_pass      redis;
               }
               proxy_pass $dlnproxy;
 }

В логах ругается
2012/03/05 00:11:39 [error] 14823#0: *1 the "$redis_key" variable is
not set, client: 172.16.10.57, server: localhost, request: "GET
/dln/testuser/23456 HTTP/1.1", subrequest: "/eval_157611100", host:
"10.238.32.174"

После повторного прочтения документации по eval понял что eval
отрабатывает раньше rewrite.....

Подскажите как выйти из этой ситуации, предпологаю что нужно парсить
переменную $uri внутри функции eval, и выделять оттуда переменные, но
как это можно реализовать??


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