1. 程式人生 > >Varnish解決帶引數的URL可能造成多份快取的問題

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;
}