N

nginx缓存文件路径计算和缓存清理方法

Bejix 代码笔记 2022-02-25

在规模不大的站点中,使用nginx自带的缓存无疑是一种高效的选择。

先看下proxy_cache_path的常见配置:

proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=one:10m max_size=1g;

在上面这行配置中定义了一个反向代理缓存路径:

1) nginx反向代理缓存的目录为/usr/local/nginx/cache;

2) 缓存文件的key和其它信息放在一个10M的共享内存中,命名为one;

3) 缓存文件最大占用1G磁盘空间;

那还有一个level=1:2是什么意思呢?举个例子吧:

比如有一个URL是http://netexr.blog.51cto.com/1.png,那么这个图片如果被缓存那他的路径就是

/usr/local/nginx/cache/9/ad/e0bd86606797639426a92306b1b98ad9

计算方法:

1) nginx先把请求地址/1.png用md5进行哈希,得到e0bd86606797639426a92306b1b98ad9

2) level=1:2就是把最后一位数9拿出来建一个目录,然后再把9前面的2位建一个目录,最后把刚才得到的这个缓存文件放到9/ad目录中。

同样的方法推理,如果配置level=1:1,那么缓存文件的路径就是/usr/local/nginx/cache/9/d/e0bd86606797639426a92306b1b98ad9

上面的例子只是最简单的URL,如果带参数呢?

比如http://netexr.blog.51cto.com/1.png?v=1,那么缓存路径还是一样吗?

先对比下这个两个配置:

proxy_cache_key $uri;
proxy_cache_key $uri$is_args$args;

第一个配置只根据不带参的$uri进行哈希,所以这时候加了参数和没加参数是一样的结果;

第二个配置就是把域名之后所有的内容(也就是$request_uri)都进行哈希。

知道了缓存路径的计算方法,我们就可以进行缓存清理了(以level=1:2为例):

#!/usr/bin/env php
<?php
$cache_dir = '/usr/local/nginx/cache/';
$request_uri = $argv[1];
$url_hash = md5($request_uri);
$dir1 = substr($url_hash,-1,1) . '/';
$dir2 = substr($url_hash,-3,2) . '/';
$cached_file = $cache_dir . $dir1 . $dir2 . $url_hash;
if (is_file($cached_file)) {
    if (unlink($cache_dir . $dir1 . $dir2 . $url_hash)) {
        echo $request_uri . " 缓存清除成功\n";
    } else {
        echo $request_uri . " 缓存清除失败\n";
    }
} else {
    echo $request_uri . " 未被缓存\n";
}

说明:

1) MD5哈希过之后的路径是十六进制的,对于nignx来说查询速度更快;

2) level=1:2会比level=1:1建立更多的目录,适合缓存海量文件,因为单个目录下的文件太多会降低IO性能;

3) 缓存会先被写入写入临时文件,所以建议proxy_cache_path和proxy_temp_path放在同一个文件系统当中,避免不通文件系统之间的磁盘IO消耗;

4) 虽然nginx有通过HTTP协议删除缓存的第三方插件,但是我考虑之后觉得还是不用的好。nginx的缓存本来就不是很成熟,外加一个第三方插件就更不让人放心了。

N
©著作权归作者所有:来自51CTO博客作者netexr的原创作品,请联系作者获取转载授权,否则将追究法律责任
nginx缓存文件路径计算和缓存清理方法
https://blog.51cto.com/netexr/1252242

PREV
Linux 使用IPTABLES SNAT&DNAT
NEXT
Vue el-table实现行内编辑 [转载]

评论(0)

发布评论