请给出你使用的 Lua 代码和 nginx 配置文件 :) 尽量是最小化的例子哈。
Regards,
-agentzh
2012/5/26 jiangfei <liujiang...@gmail.com>:
[...]
> #memcache interface
> location = /memc {
> #internal;
> set $memc_cmd $arg_cmd;
> set $memc_key $arg_key;
> set $memc_value $arg_val;
> set $memc_exptime $arg_exptime;
>
这里 $arg_XXX 变量的值都是未经过 URI 反转义的,所以里面都是 %XX 这样的东西。你应该在这里使用
set_unescape_uri 配置指令先对 $arg_XXX 变量进行反转义,即:
set_unescape_uri $memc_cmd $arg_cmd;
set_unescape_uri $memc_key $arg_key;
set_unescape_uri $memc_value $arg_val;
set_unescape_uri $memc_exptime $arg_exptime;
更多细节可以参见 ngx_set_misc 模块的 set_unescape_uri 指令的文档:
http://wiki.nginx.org/HttpSetMiscModule#set_unescape_uri
还有我的"Nginx 变量漫谈"系列的 nginx 教程:
http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html#01-NginxVariables02
> memc_pass '127.0.0.1:11211';
> #memc_pass memc_pool;
> }
>
[...]
> ngx.location.capture("/memc", {
> args={cmd="set",key="foo",val=strtable}
>
> })
这里 ngx.location.capture 的 args 选项会自动对 cmd, key, val 这三个参数的值进行 URI
转义。所以你需要在 location /memc 中进行反转义,以还原原始的值。
关于 ngx.location.capture 的此行为的更多细节请参见官方文档:
http://wiki.nginx.org/HttpLuaModule#ngx.location.capture
>
> 下面是浏览器输出:
> [{"name":"divad","sex":"man"},{"name":"xiaobao","sex":"girl"}]
> %5b%7b%22name%22%3a%22divad%22,%22sex%22%3a%22man%22%7d,%7b%22name
> %22%3a%22xiaobao%22,%22sex%22%3a%22girl%22%7d%5d
>
这里的输出证实了你未在 location /memc 中对 $arg_val 等变量的值进行 URI 反转义的错误。
另外,值得一提的是,推荐使用 lua-resty-memcached 库来从 Lua 访问 memcached 后端:
https://github.com/agentzh/lua-resty-memcached
这比你当前所使用的 ngx.location.capture + ngx_memc 的方式更为简单高效。
Regards,
-agentzh
On 5月27日, 上午12时13分, agentzh <agen...@gmail.com> wrote:
> Hello!
>
> 2012/5/26 jiangfei <liujiangfei.di...@gmail.com>:
> [...]
>
> > #memcache interface
> > location = /memc {
> > #internal;
> > set $memc_cmd $arg_cmd;
> > set $memc_key $arg_key;
> > set $memc_value $arg_val;
> > set $memc_exptime $arg_exptime;
>
> 这里 $arg_XXX 变量的值都是未经过 URI 反转义的,所以里面都是 %XX 这样的东西。你应该在这里使用
> set_unescape_uri 配置指令先对 $arg_XXX 变量进行反转义,即:
>
> set_unescape_uri $memc_cmd $arg_cmd;
> set_unescape_uri $memc_key $arg_key;
> set_unescape_uri $memc_value $arg_val;
> set_unescape_uri $memc_exptime $arg_exptime;
>
> 更多细节可以参见 ngx_set_misc 模块的 set_unescape_uri 指令的文档:
>
> http://wiki.nginx.org/HttpSetMiscModule#set_unescape_uri
>
> 还有我的"Nginx 变量漫谈"系列的 nginx 教程:
>
> http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html#01-Ng...
On 5月27日, 上午12时13分, agentzh <agen...@gmail.com> wrote:
> Hello!
>
> 2012/5/26 jiangfei <liujiangfei.di...@gmail.com>:
> [...]
>
> > #memcache interface
> > location = /memc {
> > #internal;
> > set $memc_cmd $arg_cmd;
> > set $memc_key $arg_key;
> > set $memc_value $arg_val;
> > set $memc_exptime $arg_exptime;
>
> 这里 $arg_XXX 变量的值都是未经过 URI 反转义的,所以里面都是 %XX 这样的东西。你应该在这里使用
> set_unescape_uri 配置指令先对 $arg_XXX 变量进行反转义,即:
>
> set_unescape_uri $memc_cmd $arg_cmd;
> set_unescape_uri $memc_key $arg_key;
> set_unescape_uri $memc_value $arg_val;
> set_unescape_uri $memc_exptime $arg_exptime;
>
> 更多细节可以参见 ngx_set_misc 模块的 set_unescape_uri 指令的文档:
>
> http://wiki.nginx.org/HttpSetMiscModule#set_unescape_uri
>
> 还有我的"Nginx 变量漫谈"系列的 nginx 教程:
>
> http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html#01-Ng...
--
邮件自: 列表“openresty”,专用于技术讨论!
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
详情: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
建议: 提问的智慧 http://wiki.woodpecker.org.cn/moin/AskForHelp
教程: http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html
On 5月27日, 上午9时10分, pengqi <fengm...@gmail.com> wrote:
> 使用 lua-resty-memcached 库访问 memcached 后端,比使用的 ngx.location.capture +
> ngx_memc 的方式更高效吗?我的理解是后者更为高效吧,后者毕竟是c级别的
>
> > 建议: 提问的智慧http://wiki.woodpecker.org.cn/moin/AskForHelp