nginx定向清理Proxy Cache缓存

2022-09-26 10:53:19 浏览数 (1)

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 其他状态参考:

代码语言:javascript复制
MISS 未命中,请求被传送到后端
HIT 缓存命中
EXPIRED 缓存已经过期请求被传送到后端
UPDATING 正在更新缓存,将使用旧的应答
STALE 后端将得到过期的应答

参考:

http://www.jb51.net/article/74595.htm

缓存命中率:http://www.361way.com/nginx-cache/2665.html

peace

0 人点赞