一、probe(后端探针)
探测后端,确定他们是否健康,返回的状态用req.backend.healthy核对
backend b1 { .host = "127.0.0.1"; .port = "8080"; .connect_timeout = 1s; .first_byte_timeout = 5s; .between_bytes_timeout = 2s; .max_connections=1000; .probe = { .url = "/index.jsp"; //访问backend的路径,缺省是”/" .timeout = 0.3 s; //定义probe的过期时间 .window = 8; //要检查后端服务器的次数 .threshold = 3; //.window里面要有多少polls成功就认为后端是健康的 .initial = 3; //当varnish启动的时候,要确保多少个probe正常 } }
二、ACLs :访问控制列表
acl purgeallow { "127.0.0.1"; } sub vcl_recv { ..... if(req.request =="PURGE") { if(!client.ip ~ purgeallow){ error 405 "not allowed"; } return(lookup); } ...... }
三、Grace模式
当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让那个其他几个请 求挂起等待返回结果,返回结果后,复制请求的结果发送给客户端。 如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了解 决这个问题,可以指示varnish去保持缓存的对象超过他们的TTL(就是该过期的,先别删除),并且去提供旧 的内容给正在等待的请求。 为了提供旧的内容,首先我们必须有内容去提供。
Grace模式解决了两个问题: 1:通过提供旧的内容,避免请求扎堆。 2:如果后端坏了,提供旧的内容。
sub vcl_fetch { set beresp.grace = 30m; } sub vcl_recv { if (! req.backend.healthy) { set req.grace = 5m; } else { set req.grace = 15s; } }
四、Saint模式
sub vcl_fetch { if (beresp.status == 500) { set beresp.saintmode = 10s; return(restart); }
set beresp.grace = 5m; }
设置beresp.saintmode为10秒时,varnish会不请求该服务器10秒。或多或少可以算是一个黑名单。restart被执行时,如果我们有其他后端可以提供该内容,varnish会请求它们。当没有其他后端可用,varnish就会提供缓存中的旧内容。