Hello! 2013/9/4 tyr issac: > 春哥你好,最近项目中有需要使用 $query_string为key来鉴权。 > 服务器上我做了fastcgi_cache静态缓存,因为每个$query_string都是独一无二的 > 那么每个客户都会有独立的cache。量实在太大了,所以我用了$uri作为静态缓存的key > 想通过memcache来做缓存,符合的走后端缓存,不符合的走php正常执行流程 > > PS:我不想让memcache直接返回,因为用户的key实在太多。对内存压力太大,我仅仅想使用memcache作为鉴权分发的功能。用lua该怎么实现?谢谢 1. 你可以自己从 query string 生成不含验证 token 的 key. 你可以考虑使用 set_by_lua 通过一点点 Lua 来生成 key. 2. 对于使用 memcached 作缓存,可以参考 ngx_srcache 模块,它支持使用 memcached 作缓存: http://wiki.nginx.org/HttpSRCacheModule 特别地,你可以通过 rewrite_by_lua 嵌入一点 Lua 代码来动态开关 srcache_fetch_skip 和 srcache_store_skip,例如: set $skip ''; rewrite_by_lua ' local args = ngx.var.args if not args or args == "" then ngx.var.skip = 1 end '; srcache_fetch_skip $skip; srcache_store_skip $skip; 当然,这里你也可以对 query string(即 ngx.var.args)的值进行过滤以生成合适的缓存用的 key,而不是简单地忽略带有非空 query string 的请求。 同时抄送给 openresty 中文邮件列表:https://groups.google.com/group/openresty 建议你也加入此列表并在那里讨论这样的问题。谢谢合作! Best regards, -agentzh
Hello! 2013/9/4 tyr issac: > content_by_lua ' > if $srcache_fetch_status == MISS then > proxy_pass http://127.0.0.1:8080 > else > proxy_pass http://127.0.0.1:8081 > '; > 上帝啊!你这里 content_by_lua 里面写的是 Lua 语法的代码吗? 你写的应当是你自创的某种 nginx 配置文件语法 + Lua 语法的混合物吧? 建议首先仔细阅读一下 Lua 官方手册和 ngx_lua 的官方文档吧! http://www.lua.org/manual/5.1/manual.html http://wiki.nginx.org/HttpLuaModule 当然,还有 ngx_srcache 模块的文档: http://wiki.nginx.org/HttpSRCacheModule 你没有在文档里面见过的写法,千万不要自己创造。这就像没见过的英语表达,千万不要自己发明是一样的道理。 Regards, -agentzh
dear 春哥: 我没表达清楚,事实上我是想用memcache来做纯鉴权,而非缓存。 如果memcache为miss则走不带缓存的php,如果memcache为hit则走带fastcgi_cache静态缓存。 我通过lua判断$srcache_fetch_status来分流,可是总不成功。 location / { set $key $query_string; srcache_fetch GET /memc $key; content_by_lua ' if $srcache_fetch_status == MISS then proxy_pass http://127.0.0.1:8080 else proxy_pass http://127.0.0.1:8081 ';On Thursday, September 5, 2013 1:56:21 AM UTC+8, agentzh wrote: Hello! 2013/9/4 tyr issac: > 春哥你好,最近项目中有需要使用 $query_string为key来鉴权。 > 服务器上我做了fastcgi_cache静态缓存,因为每个$query_string都是独一无二的 > 那么每个客户都会有独立的cache。量实在太大了,所以我用了$uri作为静态缓存的key > 想通过memcache来做缓存,符合的走后端缓存,不符合的走php正常执行流程 > > PS:我不想让memcache直接返回,因为用户的key实在太多。对内存压力太大,我仅仅想使用memcache作为鉴权分发的功能。用lua该怎么实现?谢谢 1. 你可以自己从 query string 生成不含验证 token 的 key. 你可以考虑使用 set_by_lua 通过一点点 Lua 来生成 key. 2. 对于使用 memcached 作缓存,可以参考 ngx_srcache 模块,它支持使用 memcached 作缓存: http://wiki.nginx.org/HttpSRCacheModule 特别地,你可以通过 rewrite_by_lua 嵌入一点 Lua 代码来动态开关 srcache_fetch_skip 和 srcache_store_skip,例如: set $skip ''; rewrite_by_lua ' local args = ngx.var.args if not args or args == "" then ngx.var.skip = 1 end '; srcache_fetch_skip $skip; srcache_store_skip $skip; 当然,这里你也可以对 query string(即 ngx.var.args)的值进行过滤以生成合适的缓存用的 key,而不是简单地忽略带有非空 query string 的请求。 同时抄送给 openresty 中文邮件列表:https://groups.google.com/group/openresty 建议你也加入此列表并在那里讨论这样的问题。谢谢合作! Best regards, -agentzh --