目标:利用memcache实现Nginx对页面/资源的缓存,提高响应速度。
前提:
1、Nginx+lua模块。搭建Nginx+Lua环境参见nginx+lua+redis构建高并发应用(ubuntu) 和nginx+lua+redis构建高并发应用(centos/rehat)。
2、memcache服务已启动。搭建linux下的memcache服务参见在Linux上安装Memcached服务
Nginx.conf配置如下:
...
#for memcache start
location ~ \.(js|css|gif|png|swf|exe|ico|xml|jpg)$ {
set $memc_key $request_uri;
add_header X-mem-key $memcached_key;
memcached_pass memcacheds;
error_page 500 404 502 504 = @app_sources;
}
location @app_sources {
content_by_lua_file ./conf/mem_req.lua;
}
location /Search {
set $memcached_key $request_uri;
add_header X-mem-key $memcached_key;
memcached_pass memcacheds;
default_type text/html;
error_page 404 502 504 = @app;
}
location @app {
default_type text/html;
content_by_lua_file ./conf/mem_req.lua;
}
location /set_memc {
rewrite_by_lua '
ngx.req.read_body();
ngx.var.memc_value = ngx.req.get_body_data();
';
set $memc_cmd "set";
set $memc_key $arg_key;
set $memc_flags "0";
set $memc_exptime "60";
memc_pass memcacheds;
}
location /memc_internal {
set_by_lua $user_req ' return "http://192.168.235.236:3000" .. ngx.var.arg_key ';
proxy_pass $user_req;
}
#for memcache end
...
解释:
set_memc :将请求的URL和后端服务返回的有效结果组成key-value存入memcache服务。
memc_internal :向后端服务发送请求URL。
mem_req.lua如下:
--ngx.say("request_uri is : ", ngx.var.request_uri)
local cap_uri = "/memc_internal?key=" .. ngx.var.request_uri
local node_res = ngx.location.capture(cap_uri)
if node_res.status == 200 then
ngx.say(node_res.body)
local res = ngx.location.capture(
'/set_memc?key='..ngx.var.request_uri,
{method = ngx.HTTP_POST, body = node_res.body}
)
--ngx.say("set_memc res is : ", res.status, res.body)
else
ngx.say("1111111111111", node_res.status, node_res.body);
end
解释:
当nginx在memcache服务中没有查询到缓存时,执行mem_req.lua。其中,执行转发后端请求,并将有效结果通过调用set_memc分支进行缓存。