varnish负载均衡实现

本文介绍了一个具体的Varnish VCL配置文件实例,详细解释了如何定义后端服务器及其负载均衡策略,并展示了如何设置缓存清理权限、请求处理流程及缓存策略等关键配置。
 
  • #这个是varnish的VCL配置文件,保存于DIR/varnish/etc/varnish/目录中。主要用于定义varnish接到请求后的处理方式和请求的方向。  
  • #定义后台服务器  
  • backend web01{  
  •  .host = "192.168.10.239"; #后台服务器的IP  
  •  .port = "80";   #端口  
  •  .connect_timeout = 1s;  #连接超时时间  
  •  .first_byte_timeout = 5s; #  
  •  .between_bytes_timeout = 2s; #两次对服务器请求的间隔时间  
  •  .probe = {   #定义对后台服务器的探针检测  
  •   .url = "/";  #检测的路径  
  •   .timeout = 0.3s; #检测超时时间  
  •   .window = 8;    
  •   .threshold = 3;  
  •   .initial = 3;  
  •  }  
  • }  
  • backend web02{  
  •  .host = "192.168.10.243";  
  •  .port = "80";  
  •  .connect_timeout = 1s;  
  •  .first_byte_timeout = 5s;  
  •  .between_bytes_timeout = 2s;  
  •  .probe = {  
  •   .url = "/";  
  •   .timeout = 0.3s;  
  •   .window = 8;  
  •   .threshold = 3;  
  •   .initial = 3;  
  •  }  
  • }  
  • #定义后台服务器组,并利用Round-Robin方式进行轮询。  
  • director load round-robin {  
  •  {  
  •    .backend = web01;  
  •  }  
  •  {  
  •   .backend = web02;  
  •  }  
  • }  
  •  
  • #定义可以对varnish缓存进行清理的用户  
  • acl purge{  
  •  "localhost";  
  • }  
  •  
  •  
  • sub vcl_recv{  
  •  if (req.request == "PURGE"){  
  •   if (!client.ip ~ purge){  
  •    error 405 "Not allowed.";  
  •   }  
  •   return (lookup);  
  •  }  
  •  if (req.http.host ~ "192.168.10.245"){  
  •   set req.backend = load;  
  •   }  
  •  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;  
  •   }  
  •  }  
  •  if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") {  
  •   return (pipe);  
  •  }  
  •  elseif (req.request != "GET" && req.request != "HEAD") {  
  •   return (pass);  
  •  }  
  •  elseif  ((req.request=="GET" || req.request=="HEAD")&& req.url ~ "\.(png|gif|jpeg|swf|css|js|jpg)$"){  
  •   return (lookup);  
  •  }  
  •  else {  
  •   return (pipe);  
  •  }  
  •  if (req.http.Accept-Encoding){   #更改主机头提高缓存命中率  
  •   if(req.url ~"\.(jpg|jpge|png|gif)$"){  
  •    #No point in compressing these  
  •    remove req.http.Accept-Encoding;  
  •   }  
  •   elseif (req.http.Accept-Encoding ~ "gzip"){  
  •    set req.http.Accept-Encoding = "gzip";  
  •   }  
  •   elseif (req.http.Accept-Encoding ~ "deflate"){  
  •    set req.http.Accept-Encoding = "deflate";  
  •   }  
  •   else{  
  •    #unknow algorithm  
  •    remove req.http.Accept-Encoding;  
  •   }  
  •  }  
  • }  
  • sub vcl_pipe {  
  •  return (pipe);  
  • }  
  • sub vcl_pass {  
  •  return (pass);  
  • }  
  • sub vcl_hash {  
  •  set req.hash += req.url;  
  •  if (req.http.host) {  
  •   set req.hash += req.http.host;  
  •  }  
  •  else {  
  •   set req.hash += server.ip;  
  •  }  
  •  return (hash);  
  • }  
  • sub vcl_hit{  
  •  if (!obj.cacheable){  
  •   return (pass);  
  •  }   
  •  else {  
  •  return (deliver);  
  •  }  
  • }  
  • sub vcl_miss{  
  •  return (fetch);  
  • }  
  • sub vcl_fetch{  
  •  if (!beresp.cacheable) {  
  •   return (pass);  
  •  }  
  •  elseif (beresp.http.Set-Cookie) {  
  •   return (pass);  
  •  }  
  •  else {  
  •   return (deliver);  
  •  }  
  • }  
  • sub vcl_deliver {  
  •  return (deliver);  
  • }  
  • sub vcl_error {  
  •  set obj.http.Content-Type = "text/html; charset=utf-8";  
  •  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>  
  •   <h3>Guru Meditation:</h3>  
  •   <p>XID: "{req.xin}" </p>  
  •   <hr>  
  •   <p>Varnish cache server</p>  
  •  </body>  
  • </html>  
  • "};  
  •  return (deliver);  
  •  
  • }  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值