web cache server方案比較:varnish、squid、nginx

linux運維中,web cache server方案的部署是一個很重要的環節,選擇也有不少種好比:varnish、squid、nginx。
下面就對當下經常使用的這幾個web cache server作一對比:前端

1)從功能上說:varnish和squid是專業的cache服務,而nginx的cache功能是由第三方模塊完成。
2)要作cache服務的話,確定是要選擇專業的cache服務,優先選擇squid和varnish。
Varnish 能夠認爲是內存緩存,速度一流,可是內存緩存也限制了其容量,緩存頁面和圖片通常是挺好的;
varnish自己的技術上優點要高於squid,它採用了「Visual Page Cache」技術,在內存的利用上,Varnish比Squid具備優點,它避免了Squid頻繁在內存、磁盤中交換文件,性能要比Squid高。
varnish是不能cache到本地硬盤上的。
Varnish可使用正則表達式快速、批量地清除部分緩存
varnish的內存管理徹底交給內核,當緩存內容超過內存閾值時,內核會自動將一部分緩存存入swap中讓出內存。以挪威一家報社的經驗,1臺varnish能夠抵6臺squid的性能。
varnish用來作網站和小文件的緩存,至關給力的,作圖片cache之類的合適
varnish沒有專門的存儲引擎
3)squid是功能最全面的比較傳統的web cache server,有本身的存儲引擎。,可是架構太老,性能不怎樣。
squid能夠用於緩存更多更大的內容,屬於專業用語緩存的功能,好比尤爲適合緩存圖片、文檔等;
squid能夠說是越俎代庖本身實現了一套內存頁/磁盤頁的管理系統,但這個虛擬內存swap其實linux內核已經能夠作得很好,squid的畫蛇添足反而影響了性能
squid支持正向代理緩存,而這方面varnish、nginx cache作不到
4)nginx原本是反向代理/web服務器,用了插件能夠作作這個副業,可是自己不支持的性能比較多。
nginx是用第三方模塊ncache作的緩衝,其性能基本達到varnish,但在架構中nginx通常做爲反向(靜態文件如今用nginx的不少,併發能支持到2萬+)。
在靜態架構中,若是前端直接面對的是CDN活着前端了4層負載的話,徹底用nginx的cache就夠了。
nginx Cache是爲了提供訪問最頻繁資源的緩存而已,適合緩存純文本體積較小的內容,緩存少許頁面資源,主業是提供Web服務與代理的做用,如果Cache內容過多容易形成性能瓶頸與負載過大.
nginx也沒有專門的存儲引擎,nginx能夠認爲是已個七層LB,再加上能夠嵌入各類腳本語言,實現WAF規則和七層的定製開發策略很是容器,但要是做爲專門的web cache server還要差很多。linux

如何構建一個高性能的緩存服務器,須要考慮的幾個關鍵的技術因素:
1)計算:須要考慮異步高併發,多核優化,cpu cache友好,須要構造一些精巧的技術結構,好比阿里swift就用到了後綴樹;
2)網絡:zero copy發包(理論上說DPDK也能夠用,sendfile;tcp內核協議棧策略定製;套接字的多路複用、port reuse等;
3)存儲:linux磁盤文件系統是通用的存儲系統,天生對於海量小文件的IO不夠友好;所以對於基於磁盤的緩存服務器來講,必須本身實現一個高性能的存儲引擎,須要針對小數塊的隨機IO優化(主要隨機讀),另外分級存儲,cache置換等也須要考慮。緩存服務器的存儲引擎的技術複雜度不過高,沒有關鍵字排序、ACID等要求,不說RDBMS的存儲引擎,比基於LSMtree(例如leveldb)的KV存儲引擎也要簡單些。
4)軟件上,則考慮 DNS、tcp、http等協議特性,好比DNS緩存,回源切換,http內容壓縮,失效時間等等。nginx

針對CDN方案的實現:如何選擇squid、Varnish、Nginx+memcache??
CDN的全稱是Content Delivery Network,即內容分發網絡。
其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。
1.使用CDN有3個好處
1)優化跨ISP網絡訪問速度,在國內大聯通和大電信之間是世界上最遠的距離,在國外,中國和其餘地區很平行,用cdn能夠優化全球響應速度
2)節約流量成本,CDN機房都通常都放在帶寬便宜的小城市,帶寬成本大概是BGP機房的1/3
3)快速提高性能,對於結構複雜的系統,部署CDN能夠在不改動代碼段狀況提高網站總體性能,立竿見影
2.市面上有不少CDN供應商,比較著名有:
Akamai (全球最大)
webluker
cloudflare
chinacache(藍汛)
網宿CDN
帝聯CDN
阿里CDN(web cache server 叫swift)
騰訊CDN
七牛雲融合CDN
3.若是須要本身搭建CDN系統,有3種主流方案能夠選擇:squid、varnish、Nginx+memcache.
1)對於大規模網站的CDN,存儲共享是個強需求。爲了消除單點,不可能只使用一臺CDN服務器,若是隻是簡單作負載均衡,單臺CDN server上須要存儲所有數據,存儲利用率過低了。
squid支持幾個實例並聯,實際使用的人很少;
varnish 只能用單實例;
nginx+memcache 自然的分佈式存儲;
固然,採用squid/varnish 也有解決辦法: 須要在它們前面部署一個支持url hash的負載均衡設備(硬件,軟件都可,好比說haproxy)
2)內存存儲的代價
若是CDN把緩存放在內存當中,當然性能會有提高,可是當服務遭遇故障重啓以後,所有數據都會丟失須要重建,這個時候會給後端應用服務器帶來很大的短時壓力服務須要較長的時間才能徹底恢復.
而實際運行當中,因爲各類緣由,CDN服務重啓的機率至關高.
3)一個很悲劇的事實
對動態網頁使用CDN,不管squid仍是varnish都不能直接用,都需定製代碼。
例如varnish會判斷response的header,若是發現裏面有set-cookie項,它就認爲這個頁面不該該被緩存。對於規模龐大/OOP封裝嚴密的網站,普通程序員根本意識不到調用哪個fucntion會輸出set-cookie,這個會致使CDN命中率急劇下降。但你也無力去對每行代碼作code review,沒有辦法,只能去修改varnish代碼了,這又引入一個新的維護成本. Squid也有這個問題
4)purge效率
purge就是CDN刪除緩存項的接口,國內的UGC網站,由於嚴厲的內容檢查制度和氾濫的垃圾廣告,刪帖子刪圖片特別頻繁,某些網站可能高達40%(發100個貼,有40個帖子可能被刪除或者修改),因此對purge的效率有要求。
squid和varnish的purge效率都達不到國內這種強度要求,nginx+memcache purge性能要好不少。
在當前的中國,遇到突發事件後,要是不及時刪除指定的連接或內容,後果可能會很嚴重(小到我的被炒,大到公司被關都有可能)
某門戶網站曾經發生過,某個連接怎麼也刪不掉,一慌張把CDN全部緩存都刪了重啓,致使內網流量瞬間暴漲,各業務線的服務器全線報警,集體罵娘!
5)推薦CDN方案
中小型網站直接買CDN服務就好,如今CDN已經進行按需付費的雲計算模式了,性價比是能夠準確計算的;
外地部署單點,推薦用squid;
準備在公司內部實施私有云戰略,推薦nginx+memcache;
不太建議使用varnish。程序員

相關文章
相關標籤/搜索