在Nginx中向Redis添加键/值

时间:2015-03-03 15:40:05

标签: nginx lua redis openresty

我想与nginx中的redis进行通信,以便在列表中存储对图像发出的请求,特别是在未在其他服务器上代理的图像上。

我安装了OpenResty,以便使用redis2_queryredis2_pass命令。

这是我的nginx配置:

location ~* \.(jpg|jpeg|gif|png)$ {
    try_files $uri @imagenotfound;

    redis2_query lpush founds $uri;
    redis2_pass 127.0.0.1:6379;

}

location @imagenotfound {

    proxy_pass http://imgdomain.com/$uri;
    proxy_set_header Host imgdomain.com;
    proxy_set_header Server imgdomain.com;

    redis2_query lpush notfounds $uri;
    redis2_pass 127.0.0.1:6379;

}

我发出的每个请求都返回一个整数,据我所知,redis2_pass返回查询结果。无论如何不返回此结果并执行查询?

如果我删除了redis2_queryredis2_pass,则图片会正确显示。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

似乎有效的解决方案是将Lua脚本与access_by_lua和resty.redis模块一起使用:

location ~* \.(jpg|jpeg|gif|png)$ {
    try_files $uri @imagenotfound;

    access_by_lua '
                    local redis = require "resty.redis"
                    local red = redis:new()
                    red:set_timeout(1000)
                    local ok, err = red:connect("127.0.0.1", 6379)
                    if not ok then
                        ngx.say("failed to connect: ", err)
                        return
                    end
                    ok, err = red:lpush("founds", ngx.var.uri)
                    if not ok then
                        ngx.say("failed to set founds: ", err)
                        return
                    end
            ';


}

location @imagenotfound {

    proxy_pass http://imgdomain.com/$uri;
    proxy_set_header Host imgdomain.com;
    proxy_set_header Server imgdomain.com;

     access_by_lua '
                    local redis = require "resty.redis"
                    local red = redis:new()
                    red:set_timeout(1000)
                    local ok, err = red:connect("127.0.0.1", 6379)
                    if not ok then
                        ngx.say("failed to connect: ", err)
                        return
                    end
                    ok, err = red:lpush("notfounds", ngx.var.uri)
                    if not ok then
                        ngx.say("failed to set notfounds: ", err)
                        return
                    end
            ';


}

如果有人拥有Lua技能并且可以告诉我这是否是正确的方法,我很乐意得到他的反馈!

无论如何,感谢您在评论中的帮助。