varnish配置示例

Varnish配置详解见此处

此配置适合3.X版本,varnish不同的配置文件的差距很大

[root@varnish_01 ~]# varnishd  -V
varnishd (varnish-3.0.4 revision 9f83e8f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2011 Varnish Software AS

以下是线上的示例配置文件

backend aaa {                             //定义后端主机aaa
    .host = "192.168.118.141";
    .port = "80";
}

backend bbb {                              //定义后端主机bbb
    .host = "192.168.118.154";
    .port = "80";
}

acl purge {                                   //定义一个访问控制列表 名字叫purge
    "localhost";
    "127.0.0.1";
}
sub vcl_recv {  
if (req.request == "PURGE") {                         //如果请求是purge
                if (!client.ip ~ purge) {                        //如果客户端的IP地址不在purge访问控制列表
                        error 405 "Not allowed.";        //返回405错误
                }
   return(lookup);                   //执行lookup函数处理缓存
  }

if (req.http.host ~"www.aaa.com") { set req.backend = aaa; } //如果请求的域名是aaa,让后端主机aaa来处理请求
       else { set req.backend = bbb;                   //如果是其他的域名,由bbb来响应
}
  if (req.request == "GET" && req.url ~ "(?i)\.(jpg|png|gif|swf|jpeg|ico)$") {                    //如果请求的是图片文件,取出起cookie
        unset req.http.cookie;
  }
     if (req.restarts == 0) {                                  //获取客户端的ip地址(经过多次代理)
        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;
        }
   }
    if (req.request != "GET" &&               //如果请求不是这些 由后端直接返回
      req.request != "HEAD" &&
      req.request != "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
        return (pipe);
    }
    if (req.url ~ "/manage(.*)$" && req.url ~ ".(aspx|asp)$") {               //如果请求是manage目录下的aspx文件或者asp文件,不缓存
               return (pass); }
    if (req.url ~ "/jkbk(.*)$" && req.http.host ~"www\.bbb\.com") {           //如果请求的url是bbb域名下的jkbk目录 不缓存
                return (pass);
    }
    if (req.request != "GET" && req.request != "HEAD") {                              
        return (pass);
    }
    if (req.http.Authorization) {           //如果是http认证请求,不缓存
        return (pass);
    } else {
    return (lookup);
    }
}
 sub vcl_pipe {
     return (pipe);
 }
sub vcl_pass {
    return (pass);
}
sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (hash);
}
sub vcl_hit {
   if (req.request == "PURGE") {
       set obj.ttl = 0 s;
       error 200 "Purged";
    }
    return (deliver);
}
sub vcl_miss {
    if (req.request == "PURGE") {
                error 404 "Not in cache.";
        }
    return (fetch);
}
sub vcl_fetch {
    if (req.url ~ "\.(html|htm)$") {                    //如果是html或者htm缓存1小时
        set beresp.ttl = 1h;
        unset beresp.http.set-cookie;                 //忽略cookie
    }
      if (req.url ~ "\.(asp|asp|aspx)$") {            //如果动态页面需要缓存的话,千万记得不要unset cookie!!!     
        set beresp.ttl = 1h;
    }
     if (req.url ~ "\.(css|mp3|jpg|png|gif|swf|jpeg|ico|js)$") {
        unset beresp.http.set-cookie;
        set beresp.ttl = 12h;
    }
   if (beresp.ttl <= 0s ||beresp.http.Set-Cookie ||beresp.http.Vary == "*") {          

            set beresp.ttl = 1h;

#          return(hit_for_pass);                                            //默认的解决方法
        }
    return (deliver);
}
 sub vcl_deliver {
     set resp.http.X-hits = obj.hits;
     set resp.http.Server = "cache.ufstone.com";
     if (obj.hits > 0) {
      set resp.http.X-Cache = "HIT cache.ufstone.com";
   } else {
       set resp.http.X-Cache = "MISS cache.ufstone.com";
   }
     return (deliver);
 }
sub vcl_error {                             //varnish错误的回显模板,可以自定义
    set obj.http.Content-Type = "text/html; charset=utf-8";
    set obj.http.Retry-After = "5";
    synthetic {"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>"} + obj.status + " " + obj.response + {"</title>
  </head>
  <body>
    <h1>Error "} + obj.status + " " + obj.response + {"</h1>
    <p>"} + obj.response + {"</p>
    <h4>We are very sorry for this mistake!</h4>
    <h4><p>We administrator:Master@TEST.com</p></h4>
    <p>This Server is too busy!!!</p>
    <p><h4>ERR UN:</h4>"} + req.xid + {"</p>
    <hr>
    <h1><p>----------[TEST.COM]----------</p></h1>
  </body>
</html>
"};
    return (deliver);
}
sub vcl_init {
        return (ok);
}
sub vcl_fini {
        return (ok);

}



####################################

迷途小运维原创

作者:john

转载请注明出处


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值