Varnish解決帶引數的URL可能造成多份快取的問題
if (req.url ~ ".(jpg|gif|png)\?.*") {
set req.url = regsub(req.url, "\?.*", "");
}
但當實際設定了以後仍然會出現URL引數變化後Varnish返回miss,這說明Varnish實際上還是以全部req.url作為hash進行快取的。有興趣的同學可以自己試試:)
我想了很久,最後終於發現這個重置了以後的req.url並沒有作為sub_hash中hash key進行快取,於是做了如下變通終於實現了按照不帶引數的URL進行快取以達到提高快取命中率和避免多份快取的目的。
其實配置的方法很簡單,即
sub_hash {
if (req.url ~ ".(jpg|gif|png)\?.*") {
set req.hash += regsub(req.url, "\?.*", "");
}
else {
set req.hash += req.url;
}
hash;
}
Varnish 2.0.2和2.0.3版本都有這個問題,我已在官方網站報了bug,見http://varnish.projects.linpro.no/ticket/465 各位有興趣的也可關注一下:)
更新: 在sub_recv中set req.url = regsub(req.url, "\?.*", "");即可,不用再在hash中新增
在header中新增cache的命中狀態的方法(在sub_deliver中新增)
if (obj.hits > 0) {
set resp.http.X-Cache = "Server-6-HIT";
} else {
set resp.http.X-Cache = "Server-6-MISS";
}
替換到後端的URL請求
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
set bereq.url = regsub(req.url, "\?.*", "");
fetch;
}