Redis2_pass with <host>:<port> from $args fail

I’m trying to address several redis instances, dispatching it on a
host:port basis (one single backend location)

here part of my nginx.conf location

location /redis_backend {
internal;
set_unescape_uri $verb $arg_verb;
set_unescape_uri $key $arg_key;
set_unescape_uri $r_host $arg_host;
set_unescape_uri $r_port $arg_port;
redis2_query $verb $key;
redis2_pass $r_host:$r_port;
}

I call /redis_backend location from a lua like this:


r_instance[“redis_host”] = ‘127.0.0.1’
r_instance[“redis_port”] = ‘33001’

local res = ngx.location.capture (
“/redis_backend”,
{ args =
{ verb = r_verb,
key = redis_key,
host = r_instance[“redis_host”],
port = r_instance[“redis_port”],
}
}
)

in nginx error log (i use the openresty suite ngx_openresty/1.0.10.44),
I
got this error

*2012/04/07 19:25:03 [error] 11715#0: 1 redis2: upstream
“127.0.0.1:33001”
not found, client: 127.0.0.1, server: …

I’m sure redis instance is up&running. I’m able to connect to her via
redis-cli or, simply setting redis2_pass 127.0.0.1:33001;

ciao
massimo

On Tue, Apr 10, 2012 at 1:32 PM, massimo ferrari
[email protected]wrote:

set_unescape_uri $r_port $arg_port;
redis2_query $verb $key;
redis2_pass $r_host:$r_port;
}

The redis2_pass directive only supports values with variable
interpolation
to be the name of an already defined upstream. For example:

upstream foo1 {
    server 10.32.26.7:6379;
}

upstream foo2 {
    server 10.32.26.7:6379;
}

http {
    server {
        location /foo {
            set $n 2;
            redis_pass "foo$n";
        }
    }
}

Your way will not work as expected.

If really you want truly dynamic redis backends (you do not want to
redefine them in nginx.conf or something like that), you can have a look
at
the lua-resty-redis library which supports exactly what you want in your
example:

Best,
-agentzh