CentOS 6.3 64bit上测试ATS 5.3.0中的正则刷新插件regex_revalidate
注意到ATS源碼目錄plugin/experimental/下面有regex_revalidate插件目錄,我們在編譯時添加--enable-experimental-plugins配置項就可以將其編譯安裝到動態庫安裝目錄/libexec/trafficserver中去。如果是ATS 4.x版本中沒有源碼的話,我們需要先將regex_revalidate單獨復制出來,利用tsxs編譯出動態庫,并安裝到動態庫安裝目錄中去就可以,這里不再闡述。這里主要談如何使用該插件實現目錄文件的正則刷新。
一、如何配置?
以刷新鳳凰網某個域名下面的資源為例,在plugin.config中添加一行
regex_revalidate.so -c rr.config -l regex_revalidate.log
將配置規則rr.config放入配置文件目錄/opt/ats/etc/trafficserver下面(假設ats安裝prefix為/opt/ats),其內容如下:
http://y2.ifengimg.com/ ? 1432650630
該配置文件中每行表示一個正則刷新的目錄,后面是過期的時間戳。從當前時間到過期時間這段時間內,正則匹配上上面某行配置的url將不會緩存,而是直接回源驗證再發送回源響應。
過期時間戳的計算采用下面的方法,在命令行輸入
date -d "20150526 22:30:30" +%s
得到設定的時間戳。這里暫且設置過期時間是當前時間的一天之后的時間戳就可以了,根據業務需求,你也可以適當修改。
如果超過過期時間戳,相應的配置行將從內存中刪除,該行配置也會失效。必要時請及時刷新配置文件。
-l選項給出了日志文件名,它默認會存放在/opt/ats/var/log/trafficserver/regex_revalidate.log中,因為它調用的日志文件接口是TSTextLogObjectCreate(),和其它插件是一樣的。
二、如何開啟插件日志?
在plugin.config中配置時指定-l參數就可以,寫日志的地方只有在list_config中的TSTextLogObjectWrite(),其他地方都是使用的TSDebug函數,要查找這部分的日志是在records.config中的配置。
CONFIG proxy.config.diags.debug.enabled INT 1
CONFIG proxy.config.diags.debug.tags STRING regex_revalidate.*
然后就在traffic.out中看到打印日志信息了。
三、測試方法:
使用wget來進行ATS本機測試
直接回源
wget -SO /dev/null "http://y2.ifengimg.com/xingzhao/JS/otherCouplet.js"
wget -SO /dev/null "http://y2.ifengimg.com/mappa/2015/05/06/e8a0212acf42d11e33338373b83b92e0.swf"
使用代理刷新
wget -SO /dev/null -e 'http_proxy=127.0.0.1:8081' "http://y2.ifengimg.com/xingzhao/JS/otherCouplet.js"
wget -SO /dev/null -e 'http_proxy=127.0.0.1:8081' "http://y2.ifengimg.com/mappa/2015/05/06/e8a0212acf42d11e33338373b83b92e0.swf"
對上面的url反復執行多次,我們只能得到緩存的狀態是[cMsSfW]或是[cMsSf ],也就是響應并不會緩存,它只會在指定的過期時間內每次都回源。
作為對比,我們測試下面的url
wget -SO /dev/null -e 'http_proxy=127.0.0.1:8081' "http://y1.ifengimg.com/auto/image/2015/0416/023115190.jpg"
我們發現它并不受影響,響應會緩存,緩存的狀態從[cMsSfW]=>[cHs f ]=>[cRs f ]
同時查看插件日志:
查看訪問日志access.log中發現同一個請求并不會緩存,都會每次回源請求,這是我們需要的結果
但是不在正則刷新范圍的url卻可以正常緩存
四、測試中出現的問題
使用wget測試時,我發現ATS會發生段錯誤并重啟,traffic_crashlog給出的部分崩潰日志如下:
FATAL: HttpTransact.cc:391: failed assert `s->pending_work == NULL`
這個bug已經得到ATS官方修復,參見JIRA
https://issues.apache.org/jira/browse/TS-3455
五、Patch之后繼續測試
考慮到ats 6.1.1目前還是不穩定,我決定仍然在ats 5.3.2上做path,主要是修改3個地方,都在proxy/http/HttpTransact.cc中,截圖如下:
手動修改后,直接安裝,繼續使用上面的url測試,發現首次刷新后,會緩存新數據,以后直接命中。由于我這里舉例的源站文件內容沒有改變,每次會返回206,但是正常情況下會返回200
從traffic.out中可以看到
Forced revalidate - http://y2.ifengimg.com/xingzhao/JS/otherCouplet.js
以自己可以修改的網站測試為例,我們發現對緩存的內存執行強制刷新的行為是這樣的,對正則匹配上的資源,在緩存中HIT_FRESH的情況下,并且其Date時間戳在規則添加時間戳之前,執行強制刷新,向源站發送304查詢,如果源站內容沒有變,還是返回舊的緩存內容,否則,返回更新后的內容,但是ats的緩存響應狀態碼仍然是[cSsSfU],不同的是文件內容有變化。
下面是刷新前后效果對比圖,刷新只會執行一次,以后都從緩存讀。即使匹配上,對刷新規則之后緩存的內容沒有作用,對未緩存的規則也沒有作用。
注意文件長度的變化。
備注:本文得到參考文獻的啟發,特別感謝4399運維軍團等的無私分享。
參考文獻
[1].http://ju.outofmemory.cn/entry/89153
[2].http://qingchunranzhi.blog.163.com/blog/static/23728612020153174434608
總結
以上是生活随笔為你收集整理的CentOS 6.3 64bit上测试ATS 5.3.0中的正则刷新插件regex_revalidate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在CentOS 6.3 64bit上安装
- 下一篇: ATS中的ComboHandler合并回