玩轉 Varnish 緩存代理

Varnish 是互聯網架構中重要的緩存代理組件。Varnish 一般跑在流量入口處,作爲最前端一道防禦,非常重要。雖然 Varnish 並不像 Nginx 那麼流行。Varnish 就像 Nginx 一樣穩定高效,如果使用得當,能極大提升整體服務性能、並且降低資源消耗。


常見互聯網架構中的多級緩存


1、將內容推送到用戶身邊的 CDN 緩存

2、類似 Varnish 的緩存代理

3、應用層緩存 Redis,Memcached

4、數據庫緩存


爲什麼緩存代理很重要


1、一些事實:內容的變動比不變少得多;用戶內容最終一致的容忍性。基於這 2 個事實,可以節約大量重複計算和資源。

2、延遲一般情況下對用戶體驗、商業業務的影響很大。所有互聯網公司都在努力降低延遲,提升用戶體驗。

3、CDN 有些情況下會大量回源,比如清空 CDN 緩存的時候,應用架構本身需要能抗 100% 流量的能力。


Varnish 的幾個功能


1. HTTP Header 的修改


請求頭的修改


unset req.http.cookie;

set req.http.X-EOOD = "EOOD";


返回頭的修改


unset beresp.http.Set-Cookie;

set beresp.http.Cache-Control = "public, max-age=31536000";


2. 內容在 Varnish 狀態的暴露


緩存的命中與否


if (obj.hits > 0) {

set resp.http.X-Cache = "HIT";

} else {

set resp.http.X-Cache = "MISS";

}


3. 負載均衡


Varnish 也支持後端服務器的輪詢之類的簡單負載均衡,但是慎用。


4. 後端保護和容錯


這個功能可能有些人沒有注意到,但是確實非常有用的功能,在後端掛掉的時候,只讀頁面仍然會成功返回給客戶。


set req.grace = 48h;


5. 訪問控制


可以根據規則路由或者屏蔽某些訪問,比如:


req.http.User-Agent

req.http.X-Forwarded-For

req.http.referer

...


簡單密碼保護:Basic Auth


if (! req.http.Authorization ~ "Basic XXXXXXX") {

error 401 "Restricted";

}


6. 多個後端合併


定義多個後端


backend ads {

.host = "ads.eood.cn";

.connect_timeout = 1s;

.first_byte_timeout = 30s;

.between_bytes_timeout = 5s;

}


backend blog {

.host = "blog.eood.cn";

.connect_timeout = 1s;

.first_byte_timeout = 30s;

.between_bytes_timeout = 5s;

}


根據域名、URL或者其他規則路由到不同的後端,這些規則可以是用戶 IP, 甚至是用戶 Cookie。


sub vcl_recv {


if (req.http.host ~ "ads" || req.url ~ "^/ads/") {

set req.backend = ads;

...

} else if(eq.http.host ~ "blog") {

set req.backend = blog;

}

}


7. 根據規則進行緩存


set beresp.ttl = 120s;


Varnish 運維常用命令


請求 URL 熱點排名, 根據熱點優化緩存策略


varnishtop -i rxurl


實時請求日誌


varnishlog


可以通過 grep 進行過濾查看你需要的信息


varnishlog -c | grep 'google'


Varnish 的注意事項


防止連接粘滯,假如你有多個不同的後端,不添加這個會導致混亂,估計很多人踩過這個坑:


sub vcl_pipe {

set bereq.http.connection = "close";

}


URL 規劃


一般緩存代理或者 CDN 都是可以通過配置 URL 規則實現不同 URL 模式使用不同的緩存策略,所以 URL 規劃非常重要。

將動態請求和靜態請求進行區分;將不同緩存級別的 URL 進行區分。這也有利於根據 URL 進行緩存清理。


最後


Varnish 是網站應用或者移動應用必不可少的緩存模塊。如果你還沒開始使用,就立刻把他加入到現有架構中吧。


原文:

https://blog.eood.cn/varnish-cache

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章