用lua访问memcached来做缓存

101 views
Skip to first unread message

ch3...@gmail.com

unread,
Apr 12, 2014, 11:58:16 AM4/12/14
to open...@googlegroups.com
下面这段小程序,我想用lua访问memcached来保存和读取缓存。但是有几个问题:1 缓存都出来的header有重复的Content-Type,但是访问backend拿到的header是正常的。怎么避免这个重复的header? 2 缓存出来的结果,会自动加上Transfer-Encoding: chunked,然后客户端会报Problem (2) in the Chunked-Encoded data。需要手动再加上Content-Length才可以,但是访问backend时候是正常的。请问这是什么原因造成的?


< HTTP/1.1 200 OK
* Server openresty/1.5.11.1 is not blacklisted
< Server: openresty/1.5.11.1
< Date: Sat, 12 Apr 2014 15:20:04 GMT
< Content-Type: text/plain
< Connection: close
< Vary: Cookie, User-Agent, Accept-Language
< Content-Type: text/html; charset=utf-8


60 content_by_lua '
61 local header_key = "header__" .. ngx.var.uri
62 local body_key = "body__" .. ngx.var.uri
63 local memcached = require "resty.memcached"
64 local memc = memcached:new()
65 memc:connect("127.0.0.1", 11211)
66 header, flags, err = memc:get(header_key)
67 body, flags, err = memc:get(body_key)
68
69 if header and body then
70 ngx.status = ngx.HTTP_OK
71 ngx.header["Content-Length"] = string.len(body)
72 for k,v in string.gmatch(header, "(%w+): (.+)") do
73 ngx.header[k]=v
74 end
75 ngx.print(body)
76 else
77 local res = ngx.location.capture("/wiki".. ngx.var.uri)
78 local value = ""
79 ngx.status = ngx.HTTP_OK
80 for k,v in pairs(res.header) do
81 ngx.header[k]=v
82 value = value .. k .. ": " .. v .. "\\r\\n"
83 end
84 ngx.print(res.body)
85
86 local ok, err = memc:set(header_key, value)
87 local ok, err = memc:set(body_key, res.body)
88 if not ok then
89 ngx.log(ngx.ERR, "cannot set memcached: ", err)
90 end
91 end
92 ';

Yichun Zhang (agentzh)

unread,
Apr 12, 2014, 2:52:28 PM4/12/14
to openresty
Hello!

2014-04-12 8:58 GMT-07:00 ch3n2k:
> 下面这段小程序,我想用lua访问memcached来保存和读取缓存。但是有几个问题:1 缓存都出来的header有重复的Content-Type,但是访问backend拿到的header是正常的。怎么避免这个重复的header?

如果你认为 ngx_lua 有问题,请提供一个最小化的完整的测试用例,以便别人可以在自己的环境里复现你看到的问题。

> 2 缓存出来的结果,会自动加上Transfer-Encoding: chunked,然后客户端会报Problem (2) in the Chunked-Encoded data。需要手动再加上Content-Length才可以,但是访问backend时候是正常的。请问这是什么原因造成的?
>

同上。

你提供的 Lua 代码片段中有一个明显的错误是没有考虑同名 header 的情况,此时 header 的 value 是一个 Lua
table,而不是一个 Lua string.

另外,对于你这里的需求,使用 ngx_srcache + ngx_memc 要高效得多:

https://github.com/agentzh/srcache-nginx-module#readme

另外,请不要同时给中英文邮件列表发贴。只有当你在一个列表中未得到回复时,才应尝试另一个列表。

Regards,
-agentzh

Zhongke Chen

unread,
Apr 14, 2014, 5:39:24 AM4/14/14
to open...@googlegroups.com
没有注意到这个列表需要审核才能发布,所以重复发了。抱歉。

昨天已经注意到srcache了,已经用它解决了。

我并不是怀疑ngx_lua,我首先怀疑的是我的程序哪里有问题,毕竟我用nginx和lua才两天。

我猜想我的程序的问题可能是因为else里面用location.capture创建了subrequest,memcached那部分没有,也许这里再加一层subrequest可以解决吧。没有时间去尝试。
Reply all
Reply to author
Forward
0 new messages