nginx 无 ngx_cache_purge 模块时的刷新方法

转自:http://floss.blog.51cto.com/683157/1056292


今天碰到一个江湖救急的事儿,要紧急把 N 多台 CacheServer 上的文件清除掉。用的都是 Nginx 来做 Cache 的。结果发现这些 Nginx 都没有配置 ngx_cache_purge 模块,那叫一个悲催啊。如果有这么个模块,那刷掉还不是小菜一碟么?可惜就是木有,你说苦逼不苦逼?时间紧,来不及换 nginx 了,所以就想了个办法,直接在文件系统上进行消灭。


要消灭对象文件,总得先找到对象所在。虽然直接删除掉 proxy_cache_path 固然很快,但是好几万个的文件,总量达到几十个G的,要重新缓存,成本很高的。所以还是得挨个找到。找到的方法跟配置有关系。好在配置比较简单。下面是cache.mumayi.com.conf的关键配置:

proxy_temp_path    /data/proxy_temp;
proxy_cache_path /data/cachedir levels=1:2 keys_zone=cache_one:6000m inactive=15d max_size=200g;

server {
……
             location / {
                        proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
                        proxy_cache cache_one;
                        proxy_cache_valid 200 304 12h;
                        proxy_cache_key $uri$is_args$args;
                        proxy_set_header Host $host;
                        proxy_set_header X-Forwarded-For $remote_addr;
                        proxy_pass http://source_site;
                        expires 15d;
                }
……
}

我需要的是两个配置项:proxy_cache_path 和 proxy_cache_key。最后形成了如下的脚本:
#!/bin/sh
DIR_CACHE=$(awk '/^proxy_cache_path/{print $2}' /usr/local/nginx/conf/vhosts/cache.conf)
cd ${DIR_CACHE}
cat /var/tmp/list.purge | php -f /var/tmp/getkey.php | sh

其中 /var/tmp/list.purge 是不含域名的待清除目标文件的访问路径列表文件,一行一个。比如:
/news/2012/11/10/011101.html
/news/2012/11/10/011101.jpg


/var/tmp/getkey.php是自己写的清理脚本,只是输出,不做清除动作,利于检查。通过管道执行sh才是最终的操作。
getkey.php的内容如下:
<?php
//$file = @fopen("/var/tmp/list.purge","r") or exit("Unable to open file!");
$file = fopen('php://stdin', 'r');
while (!feof($file)){
    $line=trim(fgets($file));
    if(!$line)
        break;
    $sum=md5($line);
    $len=strlen($sum);
    printf("rm -f %s/%s/%s\t#%s\n", $sum[$len-1], substr($sum, $len-3, 2), $sum, $line);
}
?>

如果没装php,可以先在有 php 的环境中先执行 cat /var/tmp/list.purge | php -f /var/tmp/getkey.php 得到清除命令,然后在缓存服务器上进入 proxy_cache_path 再执行命令即可。

得好好规划一下缓存服务器了,不然会很苦逼的。这次的操作,苦逼在于没有 ngx_cache_purge 模块。欣慰的是 proxy_cache_key 设置的比较简单。

你可能感兴趣的:(nginx 无 ngx_cache_purge 模块时的刷新方法)