修改完成后的varnish配置:http://songknight.blog.51cto.com/2599480/693359

varnish VCL流程图:http://songknight.blog.51cto.com/2599480/692239

    在各大论坛和网站上有很多varnish的文章,某也搜索了不少,不过可惜的是目前大部分文章还都是按照张宴老师最早的那份抄出来的。因为varnish更新到2.X的版本也有很长时间了,看着网上依旧充斥着大量1.X的文章真的很郁闷,因为varnish的语法变了= =

    最开始按照张宴老师的文章做了设置,总是报错,比如pass,好在varnish的报错里面会提示你的错误地方,还会告诉你怎么修改,pass的报错,会在说明上写着return(pass)这样的修改建议,很是贴心啊。

    下面我先把我自己的配置贴上来:

 


  
  1. backend web01 {  
  2.                .host = "192.168.10.244";  
  3.                .port = "80";  
  4.                .probe = {  
  5.                        .url = "/";  
  6.                        .interval = 5s;  
  7.                        .timeout = 1 s;  
  8.                        .window = 5;  
  9.                        .threshold = 3;  
  10.                }  
  11. }  
  12. backend web02 {  
  13.                .host = "192.168.10.243";  
  14.                .port = "80";  
  15.                .probe = {  
  16.                        .url = "/";  
  17.                        .interval = 5s;  
  18.                        .timeout = 1 s;  
  19.                        .window = 5;  
  20.                        .threshold = 3;  
  21.                }  
  22. }  
  23. backend web03 {  
  24.                .host = "192.168.10.242";  
  25.                .port = "80";  
  26.                .probe = {  
  27.                        .url = "/";  
  28.                        .interval = 5s;  
  29.                        .timeout = 1 s;  
  30.                        .window = 5;  
  31.                        .threshold = 3;  
  32.                }  
  33. }  
  34. director load round-robin {  
  35.        {  
  36.                .backend = web01;  
  37.        }  
  38.        {  
  39.                .backend = web02;  
  40.        }  
  41.        {  
  42.                .backend = web03;  
  43.        }  
  44. }  
  45. sub vcl_recv {  
  46.                if (req.http.host ~ "192.168.10.245") {  
  47.                        set req.backend=load;  
  48.                }  
  49. }  
  50. sub vcl_fetch {  
  51.                set beresp.ttl=30s;  
  52.                return (deliver);  
  53. }  
  54. sub vcl_recv {  
  55.                if ( (req.request=="GET" || req.request=="HEAD") && req.url ~ "\.(png|gif|jpeg|swf|css|js|html)$"){  
  56.                        return (lookup);  
  57.                }  
  58.                else {  
  59.                return (pass);  
  60.                }  
  61. }  
  62. sub vcl_deliver {  
  63.                if (obj.hits>0) {  
  64.                        set resp.http.X-Cache="HIT";  
  65.                }  
  66.                else {  
  67.                        set resp.http.X-Caceh="MISS";  
  68.                }  
  69. }  
  70. acl purge_acl {  
  71.                "localhost";  
  72. }  
  73. sub vcl_recv {  
  74.                if (req.request=="PURGE") {  
  75.                        if ( ! client.ip ~ purge_acl) {  
  76.                        error 405 "Not Allow!";  
  77.                        }  
  78.                purge_url (req.url);  
  79.                error 200 "Purged";  
  80.                }  

 

    我这里后端一共有三台真实服务器,并用这三台服务器组成了一个叫做load的组,如果varnish服务器接收到的访问请求是192.168.10.245,那么就将这个访问请求转发到load组,并利用RR算法对load组内的服务器进行轮询访问。

    并通过acl purge_acl定义了可以用来清除varnish缓存的地址,这里定义的是localhost,并且如果不是通过localhost(本机)想要清理缓存的就会被返回一个405的错误,如果是通过本机那么就会提示Purged。