標籤:squid 緩衝 視頻
先把以前自己寫過的幾篇老文章貼上來,Squid緩衝視頻是個很能節約企業、機構出口流量的方案。不過由於視頻網站的技術更新很快,這篇寫於2011年的文章如今是否還能不加修改的應用。我相信懂了原理之後稍加修改即可。
====================================================
開篇先來批評一下國內網站的技術文章,90%都是轉載的,轉的格式亂七八糟,再加上廣告,浮躁啊!
Squid的中文文章真是不多,能深入點講點原理的就更少了,很多是把編譯選項和conf檔案一貼了事。新手們全盤copy回去賭一把,成不成也不知道為什麼。
咱這篇就從原理講起。Squid版本眾多,主流是Squid 2.7,功能全,效能好,穩定。3.X用C++重寫,效能我沒測試過,就不人云亦云了,關鍵是有些2.X的功能沒有跟上來,比如緩衝視頻非常重要的storeurl_rewrite功能。參見Squid3的功能需求。 在一般情況下,一個URL是對應唯一一個cache object的,但是在CDN泛濫的今天,會存在不同伺服器的多個URL對應同一個檔案,這樣在Squid中,這個檔案會被反覆cache多份,達不到cache的效果,比如各個地圖網站的地圖檔案,各個視頻網站的視頻檔案。Squid 2.7裡面的storeurl_rewrite功能,就是專門解決這個問題的。
Storeurl_rewrite能將對應同一檔案的一組URL通過Regex,轉換成相同的URL,這個URL做為Storeurl這個屬性和cache一起儲存。等到做cache lookup的時候,也是根據storeurl去尋找。在squid.conf中,需要有下面幾項配置:
acl store_rewrite_list url_regex/dstdomain/… 匹配串storeurl_access allow store_rewrite_liststoreurl_access deny allstoreurl_rewrite_program /rewrite程式的路徑
關鍵就在於這個rewrite程式。Squid主進程啟動的時候,同時啟動多個這個rewrite進程(conf裡面可以配置個數),然後不斷的將匹配storeurl_rewrite_list的url以及很多參數通過stdin管道發給rewrite程式,rewrite程式本身是個死迴圈來不斷通過stdin進來的url,然後輸出到stdout,由squid程式接收。(這種helper方式在squid 2的架構中常見,也許也是個效能改進點)
具體的原理可以查一下squid.conf(2.7版的)裡面的說明,以及這個功能的官方說明網頁。
說到具體的例子,大家可以自己拿國內的搜狗地圖,優酷視頻試試看,抓一下瀏覽器發的URL,然後自己編寫這個Regex,就不細說了,以免又是copy&paste。至於對於no-cache,private,max-age等http header的改寫,在本人的實驗中,完全沒用到,大家別被別的網站誤導了。