網上收集、整理的Varnish 4.0 高命中率配置示例:
[root@node1 varnish]# cat web.vcl
#
# This is an example VCL file for Varnish.
#
# It does not do anything by default, delegating control to the
# builtin VCL. The builtin VCL is called when there is no explicit
# return statement.
#
# See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/
# and http://varnish-cache.org/trac/wiki/VCLExamples for more examples.
# Marker to tell the VCL compiler that this VCL has been adapted to the
# new 4.0 format.
vcl 4.0;
# Default backend definition. Set this to point to your content server.
probe backend_health_check {
.url = "/";
.interval = 10s;
.window = 5 ;
.threshold = 3;
}
backend web1 {
.host = "172.16.1.51";
.port = "80";
.probe = backend_health_check ;
}
backend web2 {
.host = "172.16.1.52";
.port = "80";
.probe = backend_health_check ;
}
import directors;
sub vcl_init {
new web_cluster = directors.random();
web_cluster.add_backend(web1,1);
web_cluster.add_backend(web2,2);
}
acl purges {
"localhost";
}
sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
#判斷請求主機、轉發至後端服務器,若須要支持後端虛擬主機,也可在此設置
if(req.http.host ~ "(?i)(.*)hurn\.com") {
set req.backend_hint = web_cluster.backend();
} else {
return (synth( 408 ,"Host Not Found"));
}
#定義緩存修剪
if(req.method == "PURGE") {
if(!client.ip ~ purges) {
return (synth(403,"Not Allow Purge"));
}
return(purge);
}
#定義到收到沒法理解的請求時,如何處理
if( req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE" ) {
return(pipe);
}
#定義緩存類型,若是不是GET、HEAD方式都不緩存
if(req.method != "GET" || req.method != "HEAD" ) {
return(pass);
}
#若是有認證頭部,也不緩存
if(req.http.Authorization) {
return(pass);
}
#清除客戶端發送至後端服務器時公共文件的cookie
if (req.url ~ "(?i)(.*)\.(jpg|png|gif|jpeg|flv|bmp|gz|tgz|bz2|tbz|js|css|html|htm)($|\?)") {
unset req.http.Cookie;
}
#不緩存帶Cookie的文件,js,css都帶Cookie,若是須要可緩存
if(req.http.Cookie) {
return(pass);
}
#定義特殊目錄不緩存:
if(req.url ~ "^/admin" || req.url ~ "^/login" ){
return(pass);
}
#動態內容不緩存,直接發日後端服務器
if(req.url ~ "(?i)(.*)\.(php|jsp|aspx)($|.*)") {
return(pass);
}
#設置X-Forward-For 記錄客戶端的IP,方便後端服務器記錄日誌
if(req.http.X-Forward-For) {
set req.http.X-Forward-For = req.http.X-Forward-For + " , " + client.ip ;
} else {
set req.http.X-Forward-For = client.ip ;
}
#Accept-Encoding 是瀏覽器發給服務器,聲明瀏覽器支持的編碼類型的
#修正客戶端的Accept-Encoding頭信息
#防止個別瀏覽器發送相似 deflate, gzip
if (req.http.Accept-Encoding) {
if (req.url ~ "^(.*)\.(jpg|png|gif|jpeg|flv|bmp|gz|tgz|bz2|tbz)($|\?)" ) {
unset req.http.Accept-Encoding;
}else if (req.http.Accept-Encoding ~ "gzip"){
set req.http.Accept-Encoding = "gzip";
} else if (req.http.Accept-Encoding ~ "deflate"){
set req.http.Accept-Encoding = "deflate";
} else if (req.http.Accept-Encoding ~ "sdch"){
#chrome新增長的壓縮
set req.http.Accept-Encoding = "sdch";
}else {
unset req.http.Accept-Encoding;
}
}
#剩餘內容都去查緩存
return(hash);
}
#定義清理緩存
sub vcl_purge {
return(synth(200,"Purged"));
}
sub vcl_backend_response {
# Happens after we have read the response headers from the backend.
#
# Here you clean the response headers, removing silly Set-Cookie headers
# and other mistakes your backend does.
#若是請求的是動態頁面直接發轉發
#動態請求回來的,必定要放在前面處理
if (bereq.url ~ "^(.*)\.(php|jsp|do|aspx|asmx|ashx)($|.*)") {
set beresp.http.Cache-Control="no-cache, no-store";
unset beresp.http.Expires;
return (deliver);
}
# 僅當該請求能夠緩存時,才設置beresp.grace,若該請求不能被緩存,則不設置beresp.grace
if (beresp.ttl > 0s) {
set beresp.grace = 10m;
}
#設置從後臺服務器得到的特定格式文件的緩存TTL
if (bereq.url ~ "^(.*)\.(pdf|xls|ppt|doc|docx|xlsx|pptx|chm|rar|zip)($|\?)")
{
#移除服務器發送的cookie
unset beresp.http.Set-Cookie;
#加上緩存時間
set beresp.ttl = 30d;
return (deliver);
}else if(bereq.url ~ "^(.*)\.(bmp|jpeg|jpg|png|gif|svg|png|ico|txt|css|js|html|htm)($|\?)"){
#移除服務器發送的cookie
unset beresp.http.Set-Cookie;
#加上緩存時間
set beresp.ttl = 15d;
return (deliver);
} else if(bereq.url ~ "^(.*)\.(mp3|wma|mp4|rmvb|ogg|mov|avi|wmv|mpeg|mpg|dat|3pg|swf|flv|asf)($|\?)") {
#移除服務器發送的cookie
unset beresp.http.Set-Cookie;
#加上緩存時間
set beresp.ttl = 30d;
return (deliver);
}
#從後臺服務器返回的response信息中,沒有緩存的,不緩存
if (beresp.http.Pragma ~"no-cache" || beresp.http.Cache-Control ~"no-cache" || beresp.http.Cache-Control ~"private") {
return (deliver);
}
return (deliver);
}
sub vcl_deliver{
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
#
# You can do accounting or modifying the final object here.
#添加一個Header標識,以判斷緩存是否命中。
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from cache";
} else {
set resp.http.X-Cache = "MISS from cache";
}
#去掉頭部
unset resp.http.X-Varnish;
unset resp.http.Via;
set resp.http.Server = "Web Server";
}