緩存有個大原則,就是在不影響用戶、不觸犯法律的前提下,儘量多的將資源緩存到本地。哪些HTTP資源可以cache哪些不能cache,ATS對可緩存性有一套系統的判斷機制,設置靈活,可以對全局進行配置也可以對個別資源單獨配置,可以針對單個url進行配置也可以針對文件後綴類型進行配置,可以對正常資源進行配置也可以對故障信息(狀態碼400以上)進行配置,可以對靜態資源進行配置也可以對動態資源單獨配置,現在就剖開看一下。
一、HTTP響應頭信息配置緩存級別
任何cache系統大多數資源都是通過HTTP頭信息來判斷是否可緩存的,ATS同樣如此,此頭信息的配置是資源是否cache的一個必要條件,並且根據頭部信息的情況將資源分爲3個級別,分別是:
2、有明確的緩存生命週期,具體表現是響應頭裏有expires(到什麼時間過期)或者有Cache-Control:(max-age、no-cache),這種設置對用戶最負責任,不會出錯,我們線上ATS默認使用這個級別;
1、有Last-Modified頭或者有明確的緩存生命週期,這個級別就要鬆一些了,即使資源沒有明確的緩存週期,但是通過Last-Modified頭結合ATS自身的算法機制(引進了老化因子的概念)計算出緩存時間,對資源進行緩存,存多久看後面的第五條;
0、在級別1的基礎上,對沒有明確頭部信息的資源,默認存入本地緩存,存多久見後面第五條,然後每次if-modified-since回源。
具體對應的配置如下:
proxy.config.http.cache.required_headers 0|1|2 (0是無要求,1是有Last-Modified頭或者有明確的緩存生命週期,2是有明確的緩存生命週期)
此爲ATS所有內容是否可緩存的必要不充分條件。
二、動態內容是否緩存
ATS不會像人一樣通過理性判斷去確定資源是否爲動態,他對動靜態資源的判斷完全是依賴url特徵匹配,我們線上的默認配置是不緩存,對應的配置參數是:
proxy.config.http.cache.cache_urls_that_look_dynamic 0|1 (0是不緩存,1是可緩存)
此爲動態內容ATS是否可緩存的必要不充分條件。
三、帶cookie的資源是否緩存
web2.0的網站中,很多資源帶有cookie,對於cookie的信息是否緩存,如何緩存才能不影響用戶質量考驗着cache系統的性能,ATS對於cookie的設置分5個級別:
proxy.config.http.cache.cache_responses_to_cookies INT 0|1|2|3|4
0、任何帶cookie的資源都不緩存;
1、任何帶cookie的資源都緩存;
2、只緩存是圖片的cookie資源;
3、除了文本類型其餘的cookie資源都緩存。
4、除了系統響應的沒有”Set-Cookie”或者有”Cache-Control:public”的文本類型其餘的cookie資源都緩存。(我們線上設備的默認配置級別)
此爲cookie內容ATS是否可緩存的必要不充分條件。
四、故障信息是否緩存
所謂故障信息指的是源站返回的4XX、5XX等錯誤代碼,對於故障信息是否緩存是存在爭議的,ATS在處理上將故障信息分爲兩類,一類是帶有明確生命週期的故障,另一類是沒帶有生命週期的故障,配置的參數如下:
proxy.config.http.negative_caching_enabled 0|1 (1對所有故障信息都緩存,0是隻緩存有明確生命週期的故障信息,線上默認使用的是0)
proxy.config.http.negative_caching_lifetime 2s (對有明確緩存生命週期的故障信息的緩存時間,可以根據時間時間設置,目前線上默認改爲2s)
五、對於請求頭、響應頭中無任何緩存說明的信息資源
對於這種信息ats是通過proxy.config.http.cache.required_headers頭再加上默認時間指令來控制的,比如header頭設置的是0級別,就是說對於頭部信息設置最寬鬆的策略,這時一個請求,如果沒有Cache-control、expires、Last-Modified這些字段,但是有Last-Modified頭的話,是通過最小化因子計算緩存時間,對應指令和計算方式如下:
proxy.config.http.cache.heuristic_lm_factor FLOAT 0.100000 (緩存時間=當前時間減Last-Modified時間*0.1)
對於連Last-Modified頭都沒有的信息,是通過默認存儲時間去計算的,這個nginx的判斷邏輯有點類似,不過nginx對於緩存與否是全部判斷了後再操作,但ats是存不存和存多久是分開的,哪怕存儲時間爲0也會存一下,這兩條指令如下:
proxy.config.http.cache.heuristic_min_lifetime INT 3600
proxy.config.http.cache.heuristic_max_lifetime INT 17280000
單位是秒,也就是說對這種沒任何緩存說明信息的資源最小存3600秒,最大存17280000秒。
其實對於線上環境這三條指令都是用不到的,因爲我們把header頭的級別設置爲了2。
綜上所述:對於ats而言,存儲設置是很靈活的,可以對各類資源單獨設置,如果覺得還不夠還可以在cache.config(影響cache-control字段)對單個資源進行設置。當然每一環都是有邏輯的,我舉個例子,現在比如我想要對除了授權類型的所有資源進行強制緩存10天,而且緩存期間不回源,可以這麼設置:
traffic_line -s proxy.config.http.cache.cache_urls_that_look_dynamic -v 1
traffic_line -s proxy.config.http.cache.cache_responses_to_cookies -v 1
traffic_line -s proxy.config.http.cache.required_headers -v 0
traffic_line -s proxy.config.http.cache.heuristic_min_lifetime -v 8640000
traffic_line -s proxy.config.http.cache.heuristic_max_lifetime -v 8640000
traffic_line -s proxy.config.http.cache.heuristic_lm_factor -v 0.5
traffic_line -s proxy.config.http.cache.when_to_revalidate -v 3
cache.config url_regex=.* scheme=http ttl-in-cache=240h