您的位置:首页 > 运维架构 > Nginx

nginx 无 ngx_cache_purge 模块时的刷新方法

2012-11-10 11:29 495 查看
今天碰到一个江湖救急的事儿,要紧急把 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 php purge 缓存刷新