共計 3149 個字符,預(yù)計需要花費 8 分鐘才能閱讀完成。
squid 如何強(qiáng)制緩存動態(tài)頁面,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
其實我本不想寫這個標(biāo)題,我的本意是緩存 yupoo api 的查詢數(shù)據(jù),這個過程中找到了參考方法(Caching Google Earth with Squid)。呵呵,所以偶也來一回標(biāo)題黨。
這篇參考流傳非常廣,Digg 上也被提過,我也不知道原出處是哪里了。
可是。。。。你按照它的指示設(shè)置,它并不能正確工作!!
話說回來,先說說我的需求。
最近 yupoo 的訪問速度很慢,我有一堆 api 請求經(jīng)常無法完成,猜測要么對方限制了同一 ip 的連接數(shù),要么是 yupoo 又遇到了新一輪的流量瓶頸。跟 Yupoo 的 zola 聯(lián)系后,確認(rèn)是他們的負(fù)荷太高引起的,并沒有限制連接數(shù)。所以我要想辦法在我這邊做一些緩存了。
因為我這邊本身就是用 squid 代理來解決 Ajax 中調(diào)用 API 的跨域問題的,所以自然是目標(biāo)瞄準(zhǔn)了 squid 的配置文件。
yupoo api 的請求地址是 www.yupoo.com/api/rest/?method=xx xxxxxxx…
大家都知道 squid 會自動緩存靜態(tài)文件,可對于這種動態(tài)網(wǎng)頁怎么讓它也緩存起來呢,所以在 google 上找啊找,找到上面提得那片緩存 Google Earth 的博客文章。
他的方法是:
acl QUERY urlpath_regex cgi-bin \? intranet
acl forcecache url_regex -i kh.google keyhole.com
no_cache allow forcecache
no_cache deny QUERY
# —-
refresh_pattern -i kh.google 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload
refresh_pattern -i keyhole.com 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload
原理就是用 no_cache allow 和 refresh_pattern 來設(shè)定一些緩存規(guī)則,將 google earth 的請求強(qiáng)行緩存起來。
此文一出,自然早有人去驗證,可是沒人成功,原作者也音訊全無 … squid 的郵件列表里也提到。(看標(biāo)題進(jìn)來的朋友,不要急,繼續(xù)往下讀,不會讓你空手而回的 )
我也沒在意,估計人家功力問題 。先試著用改寫一下解決 yupoo api 的緩存問題。
acl QUERY urlpath_regex cgi-bin \?
acl forcecache url_regex -i yupoo\.com
no_cache allow forcecache
no_cache deny QUERY
refresh_pattern -i yupoo\.com 1440 50% 10080 override-expire override-lastmod reload-into-ims ignore-reload
嘿,果然 nnd 毫無用處,訪問記錄里還是 一坨坨 TCP_MISS
于是翻來覆去看文檔,找資料,發(fā)現(xiàn)是 squid 的 bug 惹得禍,不過早已經(jīng)修正(嚴(yán)格來說是功能擴(kuò)展補(bǔ)丁)。
我的 squid 是 2.6.13, 翻了一下源代碼,確實已經(jīng)打好補(bǔ)丁了。
解決這個問題需要 refresh_pattern 的幾個擴(kuò)展參數(shù) (ignore-no-cache ignore-private),這幾個參數(shù)在 squid 的文檔和配置例子中均沒有提到,看來 squid 還不夠與時俱進(jìn)。
下面講一下問題所在。
先看看 yupoo api 返回的 HTTP 頭部信息(cache 相關(guān)部分)
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
這兩行是控制瀏覽器的緩存行為的,指示瀏覽器不得緩存。squid 也是遵循 RFC 的,正常情況下自然不會去緩存這些頁面。override-expire override-lastmod reload-into-ims ignore-reload 統(tǒng)統(tǒng)不能對付它。
而那個補(bǔ)丁正是對付這兩個 Cache-Control:no-cache 和 Pragma: no-cache 的。
因此把 refresh_pattern 那句要改寫成
refresh_pattern -i yupoo\.com 1440 50% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
這樣就大功告成了,squid -k reconfigure 看看 access.log , 這回里面終于出現(xiàn)
TCP_HIT/200 TCP_MEM_HIT/200 了,說明緩存規(guī)則確實起作用了,那個激動啊 555~~~~
====================
補(bǔ)充:
后來我看了一下 google earth 服務(wù)器 hk1.google.com 的 HTTP 頭部,只有
Expires: Wed, 02 Jul 2008 20:56:20 GMT
Last-Modified: Fri, 17 Dec 2004 04:58:08 GMT
,這么看來照理不需 ignore-no-cache ignore-private 也能工作,可能是作者這里寫錯了
kh.google 應(yīng)該是 kh.\.google 才對。
最后總結(jié)一下,緩存 Google Earth/Map 的正確的配置應(yīng)該是
acl QUERY urlpath_regex cgi-bin \? intranet
acl forcecache url_regex -i kh.\.google mt.\.google mapgoogle\.mapabc keyhole.com
no_cache allow forcecache
no_cache deny QUERY
# —-
refresh_pattern -i kh.\.google 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
refresh_pattern -i mt.\.google 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
refresh_pattern -i mapgoogle\.mapabc 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
refresh_pattern -i keyhole.com 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
注:
khX.google.com 是 google earth 的圖片服務(wù)器
mtX.google.com 是 google map 的圖片服務(wù)器
mapgoogle.mapabc.com 是 google ditu 的圖片服務(wù)器
http://nukq.malmam.com/archives/16
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝您對丸趣 TV 的支持。