设为首页 收藏本站
查看: 176|回复: 0

[经验分享] Varnish实现Web缓存

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-6 08:34:23 | 显示全部楼层 |阅读模式
一、varnish简介
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算 机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
varnish项目是2006年发布的第一个版本0.9.距今已经八年多了,此文档之前也提过varnish还不稳 定,那是2007年时候编写的,经过varnish开发团队和网友们的辛苦耕耘,现在的varnish已经很健壮。很多门户网站已经部署了 varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。

二、Varnish的工作原理
QQ截图20150906083412.png
varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程)。

Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。

Child进程包含多种类型的线程,常见的如:
Acceptor线程:接收新的连接请求并响应;
Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;
Expiry线程:从缓存中清理过期内容;

Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。
Varnish处理过程
vcl_recv-->lookup-->vcl_hash-->vcl_hit-->vcl_deliver
vcl_recv-->lookup-->vcl_hash-->vcl_miss-->vcl_fetch-->cache-->vcl_deliver
vcl_recv-->pipe-->vcl_pipe
vcl_recv-->pass-->vcl_pass-->vcl_fetch-->nocache-->vcl_deliver

Receive 状态:也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)
Lookup 状态:进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态
Pass 状态:在此状态下,会进入后端请求,即进入fetch状态
Fetch 状态:在Fetch状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储
Deliver 状态:将获取到的数据发送给客户端,然后完成本次请求

三、Varnish特点
    1、是基于内存缓存,重启后数据将消失
    2、利用虚拟内存方式,I/O性能好
    3、支持设置0~60秒内的精确缓存时间
    4、VCL配置管理比较灵活
    5、32位机器上缓存文件大小为最大2G
    6、具有强大的管理功能,例如top,stat,admin,list等
    7、状态机设计巧妙,结构清晰
    8、利用二叉堆管理缓存文件,达到积极删除目的

四、安装配置varnish
1、环境
  OS:CentOS 6.5
  Varnish:3.0.7
  Varnish IP:192.168.31.178
  Web:192.168.31.105
2、安装varnish
   [iyunv@varnish-1 ~]# yum install varnish  -y
   [iyunv@varnish-1 ~]# sed -i 's@VARNISH_LISTEN_PORT=.*@VARNISH_LISTEN_PORT=80@' /etc/sysconfig/varnish
   [iyunv@varnish-1 ~]# sed -i 's@VARNISH_STORAGE=.*@VARNISH_STORAGE="malloc,128M"@' /etc/sysconfig/varnish
   3、varnish的配置文件内容如下(/etc/varnish/default.vcl)
backend default {
  .host = "192.168.31.105";
  .port = "80";
}
sub vcl_recv {
     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);
     }
     if (req.request != "GET" && req.request != "HEAD") {
         return (pass);
     }
     if (req.http.Authorization || req.http.Cookie) {
         return (pass);
     }
     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 {
     return (deliver);
}
sub vcl_miss {
     return (fetch);
}
sub vcl_fetch {
     if (beresp.ttl <= 0s ||
         beresp.http.Set-Cookie ||
         beresp.http.Vary == "*") {
set beresp.ttl = 120 s;
return (hit_for_pass);
     }
     return (deliver);
}
sub vcl_deliver {
  if (obj.hits > 0){
   set resp.http.X-Cache = "HIT from " + server.ip;
  } else {
     set resp.http.X-Cache = "MISS from " + server.ip;
  }
  return (deliver);
}                     #红色部分为设置缓存是否命中的标识
sub vcl_init {
return (ok);
}
sub vcl_fini {
return (ok);
}

五、配置后端Web服务器
[iyunv@web-1 ~]# yum install httpd -y
[iyunv@web-1 ~]# echo 192.168.31.105 > /var/www/html/index.html
[iyunv@web-1 ~]# service httpd start

六、测试varnish
[iyunv@varnish-1 ~]# curl -I http://192.168.31.178/index.html
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sat, 05 Sep 2015 12:49:01 GMT
ETag: "c0b6d-f-51eff70ceede6"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 05 Sep 2015 20:50:35 GMT
X-Varnish: 1577077233
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from 192.168.31.178       #第一次未命中

[iyunv@varnish-1 ~]# curl -I http://192.168.31.178/index.html
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sat, 05 Sep 2015 12:49:01 GMT
ETag: "c0b6d-f-51eff70ceede6"
Content-Type: text/html; charset=UTF-8
Content-Length: 15
Accept-Ranges: bytes
Date: Sat, 05 Sep 2015 20:51:35 GMT
X-Varnish: 1577077234 1577077233
Age: 60
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from 192.168.31.178          #第二次以及第三次都命中了



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-109884-1-1.html 上篇帖子: Vim编辑器,find命令及bash环境配置 下篇帖子: linux-GRUB启动流程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表