使用nginx直接从redis缓存中提供内容

时间:2010-12-29 17:00:24

标签: caching nginx redis

我正在使用nginx将请求传递给Node应用程序。该应用程序基本上充当html的远程缓存(检查用户请求的是否在redis数据库中,如果它只是显示,如果没有抓住它并将其存储在redis缓存中并提供它。)

我很好奇是否有通过让nginx直接从redis提供内容来绕过点击Node应用程序?我一直在使用http_redis模块,但我无法让它工作。

一个简单的例子是:http://mywebsite.com/a其中nginx将在'a'键中提供内容,或者如果键不存在则将其传递给节点应用。这甚至可能吗?

3 个答案:

答案 0 :(得分:11)

也许比Webdis更难设置,但你可以直接在nginx守护进程中使用redis2-nginx-module之类的额外模块。您将不得不重新编译nginx。

主页上有一些很好的配置示例。

例如:

# GET /get?key=some_key
location /get {
    set_unescape_uri $key $arg_key;  # this requires ngx_set_misc
    redis2_query get $key;
    redis2_pass foo.com:6379;
}

当然,通过更多的nginx配置,您可以获得另一种URL模式。

请注意,对于此示例,您还必须编译ngx_set_misc模块。

答案 1 :(得分:3)

我知道这是一个旧线程,但仍然可能对某些人有用。我尝试了相同的方法,因为你直接使用Redis的nginx服务,而没有在nginx中使用HttpRedis2Module。当我开始工作时,我很高兴,因为它有些麻烦,但是当我做一些压力测试时,我担心它会产生非常糟糕的结果。

使用nginx->php->mongodb投放实际上比使用nginx->redis和模块更快更稳定。

答案 2 :(得分:1)

您应该可以通过将Nginx设置为Webdis的反向代理来获取某些内容。

您使用Webdis的方式是将整个命令放在网址中,以便GETa申请/GET/aGET。这意味着如果您想要提供的所有内容都可以通过location / { rewrite ^(.*)$ /GET/$1 break; proxy_pass http://127.0.0.1:7379/; } 使用,您可以在Nginx中执行以下操作:

{{1}}

(我在这里编写配置,语法可能略有偏差)。

然而,Webdis项目非常年轻,所以没有人知道它的工作效果如何,而且回复是JSON文档,还有一些额外的漏洞,你可能不想返回。