你好!现回复如下:
On Fri, Apr 20, 2012 at 2:38 PM, 张宗礼
<vzzl@163.com> wrote:
最新使用openresty搭建了一个服务器,在使用中遇到一些困难,麻烦有时间帮忙看下,谢谢。
我的目的是想使用MemcNginxModule模块读取memcache中的数据,若命中不到,则使用HttpDrizzleModule 往mysql取。
详细配置如下:
upstream my_mysql_backend{
password=123456 user=root
protocol=mysql;
drizzle_keepalive max=200 overflow=reject;
}
upstream backend{
keepalive 1024 single;
}
location /get {
set $memc_cmd 'get';
set $memc_key $arg_key;
memc_pass backend;
# rds_json on;
# add_header X-Memc-Flags $memc_flags;
}
error_page 404 @fallback;
你这里写错了,应该写作
error_page 404 = @fallback;
即对于 404 错误页,不仅需要跳转到 @fallback,而且还需要丢弃当前的 404 响应状态码。因为对于 404 响应,ngx_rds_json 模块是不会对响应体进行任何处理,即不会进行 RDS 到 JSON 的转换的。
location @fallback {
set $name $arg_key;
set_quote_sql_str $quoted_name $name;
drizzle_query "select id from users where name = $quoted_name";
drizzle_pass my_mysql_backend;
rds_json on;
}
mysql数据表结构为:id,name两个字段。。
你看到的所谓“乱码”其实是二进制的 RDS 数据流。之所以如此,是因为 ngx_rds_json 略过了 404 响应。而之所以 @fallback 的响应是 404,是因为你配置的 error_page 配置指令未指定等号修饰符,即未改写原始响应的状态码。
-----------------------------------
但是使用这个location访问数据就不会:
location ~ '^/cat/(.*)' {
set $name $1;
set_quote_sql_str $quoted_name $name;
drizzle_query "select id from users where name = $quoted_name";
drizzle_pass my_mysql_backend;
rds_json on;
}
---------------
麻烦有时间帮忙看下,是不是哪里配置错了或者不能这么使用??
从你这里的用法来看,你是想用 ngx_memc 来做 ngx_drizzle/ngx_rds_json 的缓存。建议直接使用 ngx_srcache 模块来进行缓存,而不要使用 error_page 这种比较邪恶的东西:
http://wiki.nginx.org/HttpSRCacheModule
Best regards,
-agentzh
P.S. 我同时抄送给了 openresty 邮件组:
https://groups.google.com/group/openresty/ 这样其他用户也可以看到这里的讨论。也欢迎你加入这个邮件组,并把问题发送到那里。