在使用了 Varnish 后發(fā)現,Cache hits for pass 的數量比較高,好像是不能緩存的對象請求太多,應該是應用發(fā)送了 Set-Cookie 的 HTTP Header,或者使用某些統計代碼使用了 Cookie,從而瀏覽器發(fā)送 Cookie 的 Header,導致 Varnish 認為這些請求不應該緩存。如果確實(shí)不需要 Cookies 就能正確運行的應用頁(yè)面,可以修改 VCL :
sub vcl_recv {
# 去除 Cookies (靜態(tài)文件通常不需要處理 Cookies)
if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|zip|html|htm)(\?.*|)$") {
unset req.http.cookie;
}
# 去除首頁(yè)的 Cookies
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
}
另一個(gè)可能的原因是,由于不同的瀏覽器發(fā)送的 Accept-Encoding 不同,需要緩存不同版本的內容,造成不必要的緩存空間,可以設置規范一下:
sub vcl_recv {
# 修改 Accept-Encoding 只保留必要的內容
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|jpeg)(\?.*|)$") {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
}
另一個(gè)不容忽視的是 URL 里的 Query Stings,就是問(wèn)號后的查詢(xún)字符串。如果對于每個(gè) URL 都保留一份緩存內容,可能會(huì )造成緩存重復,浪費空間,一些 URL 可能根本不需要處理 Query String,比如圖片,CSS 等,可以在 Varnish 的 VCL 里去掉 Request URL 里問(wèn)號后面的部分:
sub vcl_recv {
# 去除查詢(xún)字符串
if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|zip|html|htm)(\?.*|)$") {
set req.url = regsub(req.url, "\?.*$", "");
}
}
把這幾個(gè)部分寫(xiě)在一起(不想看上面內容卻又想優(yōu)化一下 Varnish 的直接看這個(gè)):
sub vcl_recv {
# 修改 Accept-Encoding 只保留必要的內容
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|jpeg)(\?.*|)$") {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
# 去除 Cookies 和查詢(xún)字符串 (靜態(tài)文件通常不需要處理 Cookies 和 QueryStrings)
if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|zip|html|htm)(\?.*|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.*$", "");
}
# 去除首頁(yè)的 Cookies
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
}
這里只匹配了首頁(yè)和常見(jiàn)的靜態(tài)文件,如果要匹配其它的 URL,修改一下就可以了。
聯(lián)系客服