nginx定向清理Proxy Cache缓存
作者:matrix 被围观: 4,692 次 发布时间:2017-08-22 分类:零零星星 | 无评论 »
这是一个创建于 1836 天前的主题,其中的信息可能已经有所发展或是发生改变。
很多服务器是使用nginx内置的Proxy_cache来缓存资源,防止不必要的后端请求。有时候需要单独清理某个缓存,这就麻烦了。
按照大多数做法是给nginx安装purge模块,但是目前有更加精简的办法使用代码手动删除
道理很简单:获取nginx缓存url的文件路径,然后删除就可以了。
proxy_cache_key缓存的key
nginx 配置了proxy_cache_key的话需要根据自定义的key来获取url的缓存hash值,默认的key一般都是完整的访问url
具体自己的nginx是以什么作为缓存key的,具体随便找个缓存文件vi一下看看,有些设置了upstream负载均衡,就需要替换访问的host为对应主机上的upstream节点名,SO 随便找个缓存文件看看。
缓存路径的拼接
缓存根目录中一般是 单字母/俩字母/32位字符
路径作为缓存的文件存储。
首先需要对key进行md5 Hash的计算,取出最后3位
字符。
单字母
:md5最后一位
双字母
:md5最后2,3位
最后再拼接出完整路径,删除就可以了。
缓存根目录
是nginx中配置的,默认路径就不清楚了。
PHP代码参考,其他语言还请大牛附言~
代码语言:javascript复制//去除服务器nginx缓存
$root = '/var/tmp/Tengine/proxy_cache/';
//之所以替换 使用为nginx服务器设置了反向代理proxy_pass
//具体缓存的key还需查看真实的缓存文件的key值
$map = array(
'http://www.hhtjim.com/' => 'http://www_hhtjim_com_backend/',
);
$key = @$args[0];//访问的url链接作为缓存的key
if(empty($key)) die("Please input the cache url eg:http://www.hhtjim.comn");
$key = str_replace(array_keys($map), array_values($map), $key);
$md5 = md5($key);
$file = sprintf('%s%s/%s/%s', $root, substr($md5, -1), substr($md5, strlen($md5) - 3, 2), $md5);
if (@unlink($file)) {
echo 'DEL SUCCESS:' . $key."n";die;
}
echo 'FAILED:'.$file."n";
最后再访问url看看自己服务器响应头配置的$upstream_cache_status变量X-cache缓存标记为MISS
其他状态参考:
MISS 未命中,请求被传送到后端
HIT 缓存命中
EXPIRED 缓存已经过期请求被传送到后端
UPDATING 正在更新缓存,将使用旧的应答
STALE 后端将得到过期的应答
参考:
http://www.jb51.net/article/74595.htm
缓存命中率:http://www.361way.com/nginx-cache/2665.html
peace