nginx 無 ngx_cache_purge 模塊時的刷新方法

今天碰到一個江湖救急的事兒,要緊急把 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 設置的比較簡單。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章