1. 程式人生 > >程式設計方式重新整理Squid快取伺服器的五種方法

程式設計方式重新整理Squid快取伺服器的五種方法

網站進行內容更新是常有的事情,當被快取的資源更新時,前端Squid 快取伺服器內容也必須要相應的更新,否則使用者就可能會看到過期的資料。當沒有程式支援時就需要每次登入到伺服器上執行重新整理操作,在伺服器數量小的的時候這種方式還可行,如果伺服器數量上了一定的規模,這就是一種非常笨重的處理方式,以下分別介紹通過程式設計方式實現重新整理 Squid 的三種方法:

1.  refresh_pattern 用於配置Squid 的重新整理策略,當 Squid 沒有配置 ignonre-reload 來忽略客戶端no-cache 和 reload 頭的時候。

ignore-reload - ignores a client no-cache or reload header. Doing this VIOLATES the HTTP standard. Enabling this feature could make you liable for problems which it causes. (ignore-reload, 忽略客戶端 no-cache 或 reload 頭,這是違反 HTTP 標準的做法,允許此特性可能導致相關問題 . )

在這種情況下可以通過模擬客戶端向伺服器傳送no-cache 頭( ctrl + f5 就完成此功能)來實現重新整理操作。傳送的請求頭如下:

2.  通過PURGE 頭重新整理快取,這需要 Suqid 配置 ACL 以允許 PURGE 請求頭,例項如下:

acl AdminBoxes src 127.0.0.1 172.16.0.1 192.168.0.1

acl Purge method PURGE

http_access allow AdminBoxes Purge

http_access deny Purge

開啟配置之後可以使用如下的請求頭來完成刪除操作

上個例子程式碼中,把HEAD 修改為 PURGE 即可,如下:

view plaincopy to clipboardprint?
01.$head = "PURGE {$url_component['path']} HTTP/1.1/r/n";  
02.$head .= "Accept: */*/r/n";  
03.$head .= "Host: {$url_component['host']}/r/n";  
04.$head .= "Cache-Control: no-cache/r/n";  
05.$head .= "/r/n"; 
$head = "PURGE {$url_component['path']} HTTP/1.1/r/n";
$head .= "Accept: */*/r/n";
$head .= "Host: {$url_component['host']}/r/n";
$head .= "Cache-Control: no-cache/r/n";
$head .= "/r/n";
 

3.  通過使用多播HTCP 包來完成 Squid 清理,這是 MediaWiki 目前正在使用的方法,當wiki 更新時用於更新全球的 Squid 快取伺服器,實現原理為:傳送 PURGE 請求到特定的多播組,所有 Squid 伺服器通過訂閱該多播組資訊完成刪除操作,這種實現方式非常高效,避免了 Squid 伺服器處理響應和建立 TCP 連線的開銷。參考資料: Multicast HTCP purging  

傳送no-cache 頭的方式在很多情況下不適用,因為大多數站長都會配置 ignore-reload 來阻止 no-cache 和 reload 頭以提高 Squid 的命中率;通過適當的許可權控制 PURGE 清理將是一種非常簡單可行的方式,考慮到安全問題我們可以僅允許特定的主機進行 PURGE 清理操作,對第 1 , 2 種方式 進行簡單的變通就可以用於管理較大規模數量的前端快取伺服器 - 我們可以在被允許的主機上提供一個專門的後臺重新整理佇列,這個重新整理佇列在接收到重新整理操作時就多執行緒的向前端伺服器傳送刪除指令,這樣就達到了同步重新整理的效果。第3種方式沒有進行過嘗試,因為需要安裝相應的補丁,並進行配置,操作成本相對較高,在伺服器數量特別巨大的情況下這無疑是一種非常高效的實現方式。

wget http://www.wa.apana.org.au/~dean/sources/purge-20040201-src.tar.gz
tar zxvf purge-20040201-src.tar.gz
cd purge
make
[root@cache purge]# ./purge -help
### Use at your own risk! No guarantees whatsoever. You were warned. ###

$Id: purge.cc,v 1.17 2000/09/21 10:59:53 cached Exp $
Usage: purge [-a] [-c cf] [-d l] [-(f|F) fn | -(e|E) re] [-p h[:p]]
[-P #] [-s] [-v] [-C dir [-H]] [-n]

-a display a little rotating thingy to indicate that I am alive (tty only).
-c c squid.conf location, default "/usr/local/squid/etc/squid.conf".
-C dir base directory for content extraction (copy-out mode).
-d l debug level, an or of different debug options.
-e re single regular expression per -e instance (use quotes!).
-E re single case sensitive regular expression like -e.
-f fn name of textfile containing one regular expression per line.
-F fn name of textfile like -f containing case sensitive REs.
-H prepend HTTP reply header to destination files in copy-out mode.
-n do not fork() when using more than one cache_dir.
-p h:p cache runs on host h and optional port p, default is localhost:3128.
-P # if 0, just print matches; otherwise or the following purge modes:
0x01 really send PURGE to the cache.
0x02 remove all caches files reported as 404 (not found).
0x04 remove all weird (inaccessible or too small) cache files.
0 and 1 are recommended - slow rebuild your cache with other modes.
-s show all options after option parsing, but before really starting.
-v show more information about the file, e.g. MD5, timestamps and flags.

1.清除URL中包含jackbillow.com的所有快取
./purge -p 127.0.0.1:80 -P 1 -se 'jackbillow.com'

2.清除 URL 以“.mp3”結尾的快取檔案,例如:http://www.dzend.com/abc/test.mp3
./purge -p 127.0.0.1:80 -P 1 -se '/.mp3$'

批量刪除squid快取指令碼

Squidweb快取加速軟體目前已經 是新浪、搜狐、網易等各大網站廣泛應用。Squid會在設定的快取目錄下建立多個目錄,每一個目錄下又建立多個目錄,然後才在最裡層的目錄中存放快取檔案(object)。squid會根據使用者請求網頁的URL進行雜湊,生成快取檔案,存放在某一個目錄中。squid啟動之後,將在記憶體中建立一個雜湊表,記錄硬碟中快取檔案配置的情形。

注意:

Squid接受一種客戶請求方式,用於刪除cache物件。PURGE方式並非官方HTTP請求方式之一。它與DELETE不同,對後者, squid將其轉發到原始伺服器。PURGE請求要求squid刪除在uri裡提交的目標。squid返回200(OK)或404(Not Found)。

PURGE方式某種程度上有點危險,因為它刪除了cache目標。除非你定義了相應的ACL,否則squid禁止PURGE方式。正常的,你僅僅允許來自本機和少數可信任主機的PURGE請求。配置看起來如下:

acl AdminBoxes src 127.0.0.1 172.16.0.1 192.168.0.1

acl Purge method PURGE

http_access allow AdminBoxes Purge

http_access deny Purge

而對於帶有引數的網頁,例如新浪播客的Flash播放器http: //vhead.blog.sina.com.cn/player/outer_player.swf?auto=0&vid=4469852& uid=1278987704,因“?”後面的引數不同,導致URL也不同,squid會生成多個快取檔案,雜湊分散存放在不同的目錄。如果修改了這個 outer_player.swf檔案,要更新squid快取就要去清除不同目錄下及記憶體中的很多個快取檔案,十分麻煩,於是我編寫了一個Linux下的 shell指令碼,去完成這件麻煩的事:

  指令碼檔名:clear_squid_cache.sh

  #!/bin/sh

  squidcache_path="/data1/squid/var/cache"

  squidclient_path="/usr/local/squid/bin/squidclient"

  grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}' >cache_list.txt

  for url in `cat cache_list.txt`; do

  $squidclient_path -m PURGE -p 80 $url

  done

注意: 請賦予clear_squid_cache.sh可執行許可權(命令:chmod +x ./clear_squid_cache.sh)。請確保指令碼所在目錄可寫。

  設定:

  squidcache_path= 表示squid快取目錄的路徑

  squidclient_path= 表示squidclient程式所在的路徑,預設為squid安裝目錄下的bin/squidclient

用法:

  1、清除所有Flash快取(副檔名.swf):

  ./clear_squid_cache.sh swf

  2、清除URL中包含sina.com.cn的所有快取:

  ./clear_squid_cache.sh sina.com.cn

  3、清除檔名為zhangyan.jpg的所有快取:

  ./clear_squid_cache.sh zhangyan.jpg

效率:

經測試,在DELL 2950上清除26000個快取檔案用時2分鐘左右。平均每秒可清除快取檔案177個。