歡迎您光臨本站 註冊首頁

varnish緩存清除的問題和陷阱

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

varnish緩存清除的問題和陷阱

今天遇到一個問題,
一個靜態頁面xx.com/path_x1/a.html部署在xx.com靜態集群【browse----->靜態集群varnish------>靜態集群apache】
另外一個應用又通過apache代理訪問xx.com,配置如下 :
RewriteRule ^/$ http://xx.com/path_x1/a.html   
訪問的url是 yy.com 【browse----->應用集群apache----->靜態集群varnish------>靜態集群apache】


運營修改了這個頁面,需要立即更新,及希望能通過yy.com看到最新的,於是將 yy.com傳入到我們開發的一個varnish清除工具中,結果沒效果
後來將xx.com/path_x1/a.html傳入也沒效果,而且發現yy.com和xx.com/path_x1/a.html返回的居然是兩個不同的版本


接下來看看varnish緩存基本原理

    通常情況下varnish會根據訪問的host和url作為key, 但varnish 也提供了callback即配置文件中的vcl_hash,可以定製這個key
    除此之外還有一個陷阱就是被代理伺服器的vary頭,通常情況下會返回Vary:Accept-Encoding,varnish會根據瀏覽器傳過來的這個頭(Accept-Encoding)的值,為同一個url緩存不同的版本,比如不支持壓縮,或者不同類型的壓縮(gzip?deflate?...?)
    可能某些被代理伺服器返回的vary頭是Vary:Accept-Encoding,User-Agent,那就更悲摧了,版本會更加多

我排查了varnish後端的被代理服務排除了vary這個原因,
然後同過varnishlog仔細比對通過訪問yy.com和xx.com/path_x1/a.html時的日誌,發現了問題


如果通過xx.com/path_x1/a.html訪問,那麼varnish識別的host和url分別是xx.com和/path_x1/a.html
如果通過yy.com訪問,那麼varnish識別的host和url分別是yy.com和/path_x1/a.html ,竟然不是我們通常認為的yy.com和/ ,顯然是apache在proxy到varnish時做了變化


按照上面的情況,當然是兩個不同的版本
如果要清除yy.com,需要將yy.com/path_x1/a.html傳入我們清除工具即可

看來我們的清除工具需要更自智能一些,遇到外站過來的代理,在了解映射規則的前提下智能清除緩存

[火星人 ] varnish緩存清除的問題和陷阱已經有441次圍觀

http://coctec.com/docs/service/show-post-264.html