Добавить ключ/значение в Redis в Nginx

Я хотел бы общаться с Redis из nginx, чтобы хранить в списках, какие запросы были сделаны для изображений, особенно для изображений, которые не найдены, которые проксируются на другом сервере.

Я установил OpenResty, чтобы использовать команды redis2_query и redis2_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_query и redis2_pass, изображения будут отображаться правильно.

Заранее спасибо за помощь!


person N. Hodin    schedule 03.03.2015    source источник
comment
Почему это проблема? Это потому, что вы получаете их в ответе HTTP? Совсем не удобно с этим модулем nginx, поэтому просто пытаюсь понять проблему, чтобы понять, могу ли я помочь.   -  person bitoiu    schedule 03.03.2015
comment
потому что я хочу, чтобы nginx возвращал изображение, а не целое число, которое является результатом запроса redis...   -  person N. Hodin    schedule 03.03.2015
comment
Я не лучший человек, чтобы помочь, так что это случайно. Но поможет ли просто закончить метод location с $uri?   -  person bitoiu    schedule 03.03.2015
comment
Я тоже новичок в этом модуле! Насколько я понимаю, этот модуль позволяет хранить данные в Redis в виде кеша и извлекать их с помощью redis_pass. Мне просто нужно хранить данные в Redis. Не могли бы вы привести пример вашего предложения? Спасибо за вашу помощь.   -  person N. Hodin    schedule 03.03.2015
comment
Что произойдет, если вы сначала поставите директивы redis?   -  person Linus Thiel    schedule 03.03.2015
comment
@LinusGThiel в первом месте значение сохраняется в Redis, но изображение не отображается (оно возвращает целое число). Во втором месте отображается изображение (с proxy_pass), но данные не сохраняются в повторном отображении...   -  person N. Hodin    schedule 03.03.2015


Ответы (1)


Решение, которое кажется работающим, — это использовать сценарии 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 и может сказать мне, правильно ли это сделать, я был бы рад получить его отзыв!

В любом случае спасибо за помощь в комментариях.

person N. Hodin    schedule 03.03.2015