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