Varnish服务器的安装配置_最大的

                                    硬盘级缓存技术在WEB分布式架构中的应用

  1. Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。 
  2. 图中Cache Server使用了Varnish高性能硬盘缓存服务器,对后端WEB服务器进行文件缓存,提升HTTP访问速度。 
  3. 整理个WEB分布式架构,由客户端发起访问请求,到负载均衡层,负载系统根据预先设定的调度方式,将客户请求分配到后端硬盘缓存服务器,如果命中,立即返回客户请求数据。没有命中则请求后端WEB服务器,WEB服务器先到内存缓存服务器中查询数据,如果存在立即将数据返回,否则继续往数据库服务器集群查询相应数据。 
  4. 在后端的内存服务器和数据库服务器基础上,同时加做了四层负载均衡,使用整个架构具备全均衡状态。后期扩展服务器只需要在负载均衡服务器上增加新服务IP就可以做到整体的平滑扩展。 
  5.   
  6. 1. Varnish 下载  
  7. 下载地址:http://sourceforge.net/projects/varnish/files/ 
  8.   
  9. 2. Varnish 安装  
  10. #yum install pkgconfig pcre* 
  11. #tar zxvf varnish-2.1.2.tar.gz  
  12. #cd varnish-2.1.2  
  13. #./configure –prefix=/opt/varnish  
  14. #make  
  15. #make install 
  16.   
  17. 3. Varnish 配置实例  
  18. 通过前端 varnish 缓存服务器反向代理后端 www.test.com 和 www.test2.com 网站,要求对静态文件 js|css|jpg|gif 等文件进行缓存 7 天,对网页中加有 no-cache 头信息页面不缓存。 
  19. 配置文件如下:  
  20. #vi /opt/varnish/etc/varnish/index.vcl 
  21.   
  22.   
  23.   
  24.      
  25. ###后端服务器分组 
  26.      
  27. backend te1 { 
  28.      
  29. .host = "192.168.0.110"
  30.      
  31. .port = "80"
  32.      
  33. .probe = { 
  34.      
  35. .url = "/"; #哪个 url需要varnish请求。 
  36.      
  37. .interval = 5s; #检查的间隔时间。 
  38.      
  39. .timeout = 1 s; #等待多长时间探针超时。 
  40.      
  41. .window = 5; #维持5个sliding window的结果。 
  42.      
  43. .threshold = 3; #至少有三次window是成功的,就宣告bachend健康。 
  44.      
  45.      
  46. backend te2 { 
  47.      
  48. .host = "192.168.0.155"
  49.      
  50. .port = "80"
  51.      
  52. .probe = { 
  53.      
  54. .url = "/"
  55.      
  56. .interval = 5s
  57.      
  58. .timeout = 1 s; 
  59.      
  60. .window = 5
  61.      
  62. .threshold = 3
  63.      
  64.      
  65.   
  66.      
  67. ###定义集群 
  68.      
  69. director myvarnish round-robin { 
  70.      
  71. .backend = te1; } 
  72.      
  73. .backend = te2; } 
  74.      
  75.   
  76.      
  77.      
  78.   
  79.      
  80. ###清除缓存,访问控制 
  81.      
  82. acl local { 
  83.      
  84. "localhost"; 
  85.      
  86. "127.0.0.1"; 
  87.      
  88.      
  89.   
  90.      
  91. ###判断host请求针对哪个后端服务器 
  92.      
  93. sub vcl_recv { 
  94.      
  95. if (req.http.host ~ "^(www.)?test.com$") { 
  96.      
  97. set req.backend = myvarnish
  98.      
  99.      
  100. #elsif (req.http.host ~ "^(www.)?test2.com$") { 
  101.      
  102. #set req.backend = te2
  103.      
  104.      
  105. else { 
  106.      
  107. error 404 "Unknown HostName!"; 
  108.      
  109.      
  110.   
  111.      
  112. ###不允许非访问控制列表的IP进行缓存清除 
  113.      
  114. if (req.request == "PURGE") { 
  115.      
  116. if (!client.ip ~ local) { 
  117.      
  118. error 405 "Not Allowed."; 
  119.      
  120. return (lookup); 
  121.      
  122.      
  123.      
  124.   
  125.      
  126. ###清除url中有jpg|png|gif等文件的cookie 
  127.      
  128. if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$") { 
  129.      
  130. unset req.http.cookie; 
  131.      
  132.      
  133.   
  134.      
  135. ###获取客户端IP地址 
  136.      
  137. if (req.http.x-forwarded-for) { 
  138.      
  139. set reqreq.http.X-Forwarded-For = 
  140.      
  141. req.http.X-Forwarded-For ", " client.ip; 
  142.      
  143. } else { 
  144.      
  145. set req.http.X-Forwarded-For = client.ip; 
  146.      
  147.      
  148. if (req.request != "GET" && 
  149.      
  150. req.request != "HEAD" && 
  151.      
  152. req.request != "PUT" && 
  153.      
  154. req.request != "POST" && 
  155.      
  156. req.request != "TRACE" && 
  157.      
  158. req.request != "OPTIONS" && 
  159.      
  160. req.request != "DELETE") { 
  161.      
  162. return (pipe); 
  163.      
  164.      
  165.   
  166.      
  167. ###针对请求和url地址判断是否缓存 
  168.      
  169. if (req.request != "GET" && req.request != "HEAD") { 
  170.      
  171. return (pass); 
  172.      
  173.      
  174. if (req.http.Authorization || req.http.Cookie) { 
  175.      
  176. return (pass); 
  177.      
  178.      
  179. if (req.request == "GET" && req.url ~ "\.(php)($|\?)") { 
  180.      
  181. return (pass); 
  182.      
  183.      
  184. return (lookup); 
  185.      
  186.      
  187.   
  188.      
  189. sub vcl_pipe { 
  190.      
  191. return (pipe); 
  192.      
  193.      
  194.   
  195.      
  196. sub vcl_pass { 
  197.      
  198. return (pass); 
  199.      
  200.      
  201.   
  202.      
  203. sub vcl_hash { 
  204.      
  205. set req.hash += req.url; 
  206.      
  207. if (req.http.host) { 
  208.      
  209. set req.hash += req.http.host; 
  210.      
  211. } else { 
  212.      
  213. set req.hash += server.ip; 
  214.      
  215.      
  216. return (hash); 
  217.      
  218.      
  219.   
  220.      
  221. sub vcl_hit { 
  222.      
  223. if (!obj.cacheable) { 
  224.      
  225. return (pass); 
  226.      
  227.      
  228. return (deliver); 
  229.      
  230.      
  231.   
  232.      
  233. sub vcl_miss { 
  234.      
  235. return (fetch); 
  236.      
  237.      
  238.   
  239.      
  240. sub vcl_fetch { 
  241.      
  242. if (!beresp.cacheable) { 
  243.      
  244. return (pass); 
  245.      
  246.      
  247. if (beresp.http.Set-Cookie) { 
  248.      
  249. return (pass); } 
  250.      
  251. if (beresp.http.Pragma ~ "no-cache" || 
  252.      
  253. beresp.http.Cache-Control ~ "no-cache" || 
  254.      
  255. beresp.http.Cache-Control ~ "private") { 
  256.      
  257. return (pass); 
  258.      
  259.      
  260.   
  261.      
  262. ###让varnish服务器缓存 
  263.      
  264. if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$") 
  265.      
  266.      
  267. set beresp.ttl = 7d
  268.      
  269.      
  270.   
  271.      
  272. return (deliver); 
  273.      
  274.      
  275.   
  276.      
  277. ###查看缓存命中情况 
  278.      
  279. sub vcl_deliver { 
  280.      
  281. set resp.http.x-hits = obj.hits ; 
  282.      
  283. if (obj.hits > 0) { 
  284.      
  285. set resp.http.X-Cache = "HIT cqtel-bbs"
  286.      
  287. } else { 
  288.      
  289. set resp.http.X-Cache = "MISS cqtel-bbs"
  290.      
  291.      
  292.      
  293.   
  294.      
  295. sub vcl_error { 
  296.      
  297. set obj.http.Content-Type = "text/html; charset=utf-8"
  298.      
  299. synthetic {" 
  300.      
  301. <?xml version="1.0" encoding="utf-8"?> 
  302.      
  303. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  304.      
  305. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
  306.      
  307. <html> 
  308.      
  309. <head> 
  310.      
  311. <title>"} obj.status " " obj.response {"</title> 
  312.      
  313. </head> 
  314.      
  315. <body> 
  316.      
  317. <h1>Error "} obj.status " " obj.response {"</h1> 
  318.      
  319. <p>"} obj.response {"</p> 
  320.      
  321. <h3>Guru Meditation:</h3> 
  322.      
  323. <p>XID: "} req.xid {"</p> 
  324.      
  325. <hr> 
  326.      
  327. <address> 
  328.      
  329. <a href="http://www.test.com/">test cache server</a> 
  330.      
  331. </address> 
  332.      
  333. </body> </html> 
  334.      
  335. "}; 
  336.      
  337. return (deliver); 
  338.      
  339. 4. Varnish 启动与停止,动态加载配置文件  
  340. 创建 www 用户  
  341. #useradd www  
  342.  
  343. 启动: 
  344. #!/bin/sh  
  345. ulimit -SHn 51200  
  346. /opt/varnish/sbin/varnishd -u www -g www -f /opt/varnish/etc/varnish/bbs.vcl -a 192.168.0.125:80 -s file,/data/varnish_cache/varnish_cache.data,2G -w 1024,51200,10 -t 3600 -T 192.168.0.125:3500  
  347.  
  348. 参数:  
  349. -u 以什么用运行  
  350. -g 以什么组运行  
  351. -f varnish 配置文件  
  352. -a 绑定 IP 和端口  
  353. -s varnish 缓存文件位置与大小  
  354. -w 最小,最大线程和超时时间  
  355. -T varnish 管理端口,主要用来清除缓存  
  356. 注:32位文件系统限制缓存数据文件大小为 2G 
  357.   
  358. 停止:  
  359. #pkill varnishd 
  360.   
  361. 5. Varnish 缓存清除  
  362. #/opt/varnish/bin/varnishadm -T 192.168.0.125:3500 purge "req.http.host ~ www.test.com$ && req.url ~ /static/p_w_picpath/test.php"  
  363.  
  364. 说明:  
  365. 192.168.0.125:3500 为被清除缓存服务器地址  
  366. www.test.com 为被清除的域名  
  367. /static/p_w_picpath/test.php 为被清除的url地址列表 
  368.   
  369. 清除所有缓存  
  370. #/opt/varnish/bin/varnishadm -T 127.0.0.1:3500 purge.rul *$ 
  371.  
  372. 清除p_w_picpath目录下所有缓存  
  373. #/opt/varnish/bin/varnishadm -T 127.0.0.1:3500 purge.url /p_w_picpath/