varnish配置
典型的vcl配置,编辑default.vcl配置脚本,根据自己的实际需求调整
#backend 定义后端服务器:告诉varnish遇到http请求应该从哪里去获取请求对应的内容
#指定web服务器地址host,指定varnish运行端口port
#一般来说,varnish先从缓存查找,如果没命中才会去后端服务器请求
backend ihs1 {
.host = “127.0.0.1”;
.port = “8080”;
}
#如果有多个web/应用服务器,说明你有负载均衡设置,那么定义多个后端服务器即可
backend ihs2 {
.host = “127.0.0.1”;
.port = “8080”;
}
#定义varnish允许来自哪些IP段的清楚缓存的命令
acl purge {
“localhost”;
“127.0.0.1”;
“10.23.17.0”/24;
}
#如果多个web服务器要做负载均衡,就这么配置
#director 还有多种方式可以指定
director ihs_director round-robin {
{ .backend = ihs1;}
{ .backend = ihs2;} # 有多个则加多个后端服务器即可
}
#处理http请求
sub vcl_recv {
set req.backend = ihs_director;
#如果是get请求则尝试从缓存查找,因为POST请求一般是表单提交,不要缓存
if(req.request == "GET" && req.url ~ "^/.*$") {
unset req.http.cookie;
if (! req.backend.healthy) {
set req.grace = 30m;
} else {
set req.grace = 15s;
}
if(req.restarts == 0){
if (req.http.x-forwarded-for){
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", "+ client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
return (lookup);
}
#如果是BAN命令,说明收到来自客户端清除varnish缓存的命令
if (req.request == "BAN") {
if (!client.ip ~ purge) {
error 405 "Not allowed";
}
set req.url = regsuball(req.url,"%28","(");
set req.url = regsuball(req.url,"%29",")");
set req.url = regsuball(req.url,"%7C","|");
if (req.url ~ "^/$") {
ban("req.url == " + req.url);
} else {
ban("req.url ~ " + req.url);
}
error 200 "Ban added";
} elsif (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed";
}
return(lookup);
}
return (pass);
}
#命中
sub vcl_hit {
if (req.request == “PURGE”) {
purge;
error 200 “Purged.”;
}
}
#未命中
sub vcl_miss {
if (req.request == “PURGE”) {
purge;
error 200 “Not in cache.”;
}
}
#处理错误请求
sub vcl_error {
if (obj.status == 750) {
set obj.http.Location = “http://www.suning.com/”;
set obj.status = 302;
}
return(deliver);
}
#表示varnish已经从后端服务器获取内容,现在将控制权交给varnish来处理
#一般情况下,就是将该内容缓存起来
sub vcl_fetch {
if(beresp.status >= 400){
set beresp.ttl = 0s;
set beresp.http.Cache-Control = "no-cache,no-store,max-age=0";
}
if(beresp.http.Content-Length == "0" ){
set beresp.ttl = 0s;
}
if(beresp.http.Cache-Control ~ "no-cache,no-store,max-age=0"){
set beresp.ttl = 0s;
}
#定义显示在http请求头中消息
set beresp.http.Server = "SNWS";
set beresp.grace = 30m;
unset beresp.http.Set-Cookie;
set beresp.http.Last-Modified = now;
set beresp.http.magicmarker = "1";
}
sub vcl_deliver{
if (resp.http.magicmarker) {
/* Remove the magic marker /
unset resp.http.magicmarker;
/ By definition we have a fresh object */
set resp.http.age = “0”;
}
#如果命中,定义显示在http请求头消息中的标志
#可应firefox的firebug工具查看这些请求头
if (obj.hits > 0) {
set resp.http.X-Cache = “Test-HIT_24”;
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache = “Test-MISS_24”;
}
unset resp.http.X-Varnish;
unset resp.http.Expires;
set resp.http.Via = “1.1 Xcache_Test_24”;
}