squid中refresh_pattern參數用法及解釋

refresh_pattern指令如下:

refresh_pattern [-i] regex min percent max [options]


* percent與Min、Max兩個值是完全沒有關係

先理解什麼情況下響應過期:

1.緩衝對象在squid的cache緩衝的時間大於refresh_pattern定義的max ,該響應過期;

2.緩衝對象在squid的cache緩衝的時間大於(原始數據進入squid的緩衝的時間-原始web數據所規定的Last-

  Modified時間)*percent,該響應過期;


override-expire
該選項導致squid在檢查Expires頭部之前,先檢查min值。這樣,一個非零的min時間讓squid返回一個未確認的cache命中,即使該響應準備過期。

override-lastmod
改選項導致squid在檢查LM-factor百分比之前先檢查min值。

reload-into-ims
這個參數不是refresh_pattern中的參數,他是一個單獨的參數.
在flashget和迅雷之類的軟件,下載時發送http header時會包含下列信息:
Cache-Control:no-cache
Pragma:no-cache

這樣的話squid主機接受這http header以後會讓squid服務器直接連接web server取新的數據。這樣對服務器很大的壓力,
reload-into-ims參數的意思是將client請求的no-cache或reload請求轉變成If-Modified-Since,而If-Modified-Since這個參數是用於判斷文件是否被modified,這時squid和RS之間的數據傳輸僅僅只是驗證文件是否更新或更改,如果RS返回的是文件未被更改,則直接由squid的cache文件返回給client,如果更改了,再到後端RS獲取最新的文件並被squid緩存,這樣做可以節省帶寬,增加訪問速度。
這個參數違反 HTTP 協議,但是對大部分網站來說是可以設置爲 on 的,只要後端服務器對If-Modified-Since 頭的判斷正確即可。


大概意思是:只在源服務器上文件變動的情況下才實際更新cache當中的內容。

ignore-reload

1.不能通過 % squidclient -r http://www.lrrr.org/junk >/tmp/foo來強迫緩存響應更新
2.忽略瀏覽器的刷新操作(刷新操作會強迫squid調用新頁面)
3.該選項導致squid忽略請求裏的任何no-cache指令,會強行緩存.除非正常從squid過期(希望頁面一進入cache就不刪除,直到被主動purge掉爲止)






ignore-no-cache

該選項處理http頭部信息:

Pragma: no-cache

Cache-control: no-cache



ignore-no-store ignore-ridate

以上兩個選項是爲了處理http頭部信息:

Cache-Control: no-store, must-ridate
Cache-Control: no-cache, must-ridate



ignore-no-cache ignore-private

處理http頭部信息:Cache-Control: no-cache, must-ridate
                  Pragma: no-cache

這兩行是控制瀏覽器的緩存行爲的,指示瀏覽器不得緩存

以上兩個參數就是爲了處理動態文件不能被緩存的問題.


eg:

refresh_pattern   -i \.jpg$      180    90%    1440   reload-into-ims ignore-no-cache


refresh_pattern   -i http://xxx/jobs_nv/ajax_keywords.asp  1440 50% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private

第一個例子是緩存jpg,第二個例子是緩存動態文件asp



ignore-reload和reload-into-ims的區別:

ignore-reload 會強行緩存,對no-cache當沒有見到,但使用  reload-into-ims,當有no-cache的請求發過來時,他會發一個http頭部回去問源服務器(上層服務器),是否有修改,如果修改就更新,如果沒有就返回給客戶.

regexp參數是大小寫敏感的正則表達式。你可以使用-i選項來使它們大小寫不敏感。squid按順序來檢查refresh_pattern行;當正則表達式之一匹配URI時,它停止搜索。

理解squid檢查不同值的順序非常重要。如下是squid的refresh_pattern算法的簡單描述:

假如響應年齡超過refresh_pattern的max值,該響應過期;

假如LM-factor少於refresh_pattern百分比值,該響應存活;

假如響應年齡少於refresh_pattern的min值,該響應存活;

其他情況下,響應過期。



在squid.conf.default裏面,refresh_pattern參數下面的註釋是這樣的:
  TAG: refresh_pattern
       usage: refresh_pattern [-i] regex min percent max [options]
       Basically a cached object is:
               FRESH if expires < now, else STALE
               STALE if age > max
               FRESH if lm-factor < percent, else STALE
               FRESH if age < min
               else STALE
以上所有的時間都是以分鐘爲單位計算。

·         refresh_pattern指出的緩衝對象過期了,這個對象過期。

·         refresh_pattern指出的緩衝對象在squid的cache緩衝的時間大於max的話,這個對象過期。

·         refresh_pattern指出的緩衝對象的lm-factor大於等於percent的話,這個對象過期。

·         refresh_pattern指出的緩衝對象在squid的cache緩衝的時間小於min的話,這個對象不過期。

可是,這個lm-factor到底是怎麼算的?有什麼具體意義? look下面的圖:

上面這張圖來自於《Squid.Definitive.Guide》第七章,對squid的LM-factor算法作出了一個很直觀的描述。

請注意這張圖的起始時間座標:Last-Modified,這個是由squid讀取的原始web數據所規定的。
然後就是Date,這個是原始數據進入squid的緩衝的時間。
最後就是Expires,這個就是原始數據在squid中的緩衝過期時間。
可以很容易的得出結論,對於LM-factor算法來說,原始數據在squid中的緩衝時間爲
(原始數據進入squid的緩衝的時間-原始web數據所規定的Last-Modified時間)*percent
所以,我們可以鄭重得出結論,在squid的refresh_pattern設置中,percent與Min、Max兩個值是完全沒有關係!
最後總結一下,對於squid來說,緩衝的數據在cache中的存活時間是這樣決定的:

如果有定義refresh_pattern:只要滿足以下兩個條件之一,緩衝對象過期

緩衝對象在squid的cache緩衝的時間大於refresh_pattern定義的max

緩衝對象在squid的cache緩衝的時間大於(原始數據進入squid的緩衝的時間-原始web數據所規定的Last-Modified時間)*percent

如果符合多個refresh_pattern定義,以第一條符合定義的refresh_pattern爲準

如果沒有符合定義的refresh_pattern,則按squid的默認處理規則 




Squid 反向代理一般只緩存可緩衝的數據(比如 html 網頁和圖片等),而一些 CGI 腳本程序或者 ASP、JSP 之類的動態程序默認不緩存。它根據從 WEB 服務器返回的 HTTP 頭標記來緩衝靜態頁面。有四個最重要 HTTP 頭標記:

Last-Modified: 告訴反向代理頁面什麼時間被修改 
Expires: 告訴反向代理頁面什麼時間應該從緩衝區中刪除 
Cache-Control: 告訴反向代理頁面是否應該被緩衝 
Pragma: 用來包含實現特定的指令,最常用的是 Pragma:no-cache 


例如:http://bbs.linuxtone.org/viewthread.php?tid=138

refresh_pattern 20%

假設源服務器上www.aaa.com/index.htm -----lastmodified 是 2007-04-10 02:00:00
squid上 proxy.aaa.com/index.htm index.htm進入cache的時間 2007-04-10 03:00:00

1)如果當前時間 2007-04-10 03:00:00 也就是說squid剛剛緩存上
源年齡  =3點-2點=60分鐘  對象進入cache的時間 - 頁面自身修改時間
響應年齡 =0分鐘           當前時間- 對象進入cache的時間
index.htm還可以在cache停留的時間(源年齡)*20%=12分鐘
也就是說,index.htm進入cache後,可以停留12分鐘,才被重新確認。

2)如果當前時間 2007-04-10 03:05:00  也就是說squid已緩存了5分鐘
源年齡  =3點-2點=60分鐘
響應年齡 =5分鐘
index.htm還可以在cache停留的時間(源年齡 )* 20% - 響應年齡 = 12分鐘-5分鐘=7分鐘
LM-factor=響應年齡/源年齡=5/60=8.3%<20%

一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之後,cache中的頁面index.htm終於stale。
如果這時沒有index.htm的請求,index.htm會一直在緩存中,如果有index.htm請求,squid收到該請求後,由於已經過期, squid會向源服務器發一個index.htm是否有改變的請求,源服務器收到後,如果index.htm沒有更新,squid就不用更新緩存,直接把緩存的內容放回給客戶端,同時,重置對象進入cache的時間爲與源服務器確認的時間,比如2007-04-10 03:13:00,如果正好在這個後重新確認了頁面。重置後,resource age變長,相應在cache中存活的時間也變長。

如果有改變則把最新的index.htm返回給squid,squid收到會更新緩存,然後把新的index.htm返回給客戶端,同時根據新頁面中的Last_Modified和取頁面的時間,重新計算resource age,進一步計算出存活時間。

實際上,一個頁面進入cache後,他的存活時間就確定了,即 (resource age) * 百分比,一直到被重新確認。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章