nginx緩存文件路徑計算和緩存清理方法

在規模不大的站點中,使用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的緩存本來就不是很成熟,外加一個第三方插件就更不讓人放心了。

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