1、Varnish概述
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸Verdens Gang(http://www.vg.no)使用三台Varnish代替了原来的12台squid,性能居然比以前更好。
Varnish的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂很多;
在1975年时,储存媒介只有两种:内存与硬盘。但现在计算 机系统的内存除了主存外,还包括了cpu内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此squid cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
监听端口号: 6081 -- 在生产上应该去监听80或者443;
官方网站:
https://www.varnish-cache.org/
下载:
http://varnish-cache.org/releases/index.html
2、varnish基础概念详解
1、比起squid更加轻量级,大致有以下几个特点: 2、可以 基于内存缓存,也可以在磁盘上缓存 3、如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或使用SSD * 2 做RAID1避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如果必须要缓存在磁盘上还是建议使用ssd磁盘 4、可以利用虚拟内存方式,IO性能会非常好 5、支持设置 0-60秒 精确缓存时间 2.1 支持VCL 其配置是通过vcl编程语言来完成的。 其配置需要先转换成C代码,所以使用vcl所写的配置,要先转换成C语言代码,因此要依赖于GCC 临时的编译vcl配置的,编译完之后才能运行起来 注: Varnish Configuration Language - VCL(varnish配置语言-VCL)。 Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。 VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。 2.2 独特的日志存储及管理机制 日志既然保存在内存中,日志可以供多个应用程序所访问,所以一般查看命中率(通过缓存查询的内容),当前请求有多少get post 方法等等,都需使用专用的工具才可以查看,比如varnishshtopvarnishlog 等命令工具用来查看日志信息 2.3 支持使用varnish状态引擎 通过巧妙的状态引擎的设计完成不同的引擎对 用户的请求和缓存代理机制进行处理,用配置文件为状态引擎提供状态法则(分配规则),完成缓存处理、完成代理处理等等 3 、varnish 缓存原理 3.1 varnish缓存数据机制: 3.2 VCL处理流程图 处理过程大致分为如下几个步骤: Receive状态,也就是 请求处理的入口状态 ,根据VCL规则判断该请求 应该是Pass或Pipe,或者进入Lookup(本地查询) 。 Lookup状态,在 缓存中查找用户请求的对象 ,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;进入此状态后,会在hash表中查找数据,若找到,则进入Hit(命令中)状态,否则进入miss(没命中)状态。 Pass状态,在此状态下,会进入后端请求,即进入fetch取状态。 Fetch状态,在Fetch取状态下,对请求,进行后端的获取,发送请求,获得数据,并进行本地的存储。 Deliver 提供状态, 将获取到的数据发送给客户端,然后完成本次请求。 注: pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中; pipe:不对客户端进行检查或做出任何操作,而是在 客户端与后端服务器之间建立专用 “ 管道 ”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中; 总结: 用户通过varnish加速时,有4线路可以获得数据。 4、Varnish部署 环境: Master : 192.168.3.201 Web1 : 192.168.3.202 Web2 :192.168.3.203 1)、基础环境部署流程####Web1 和 Web 2上先使用yum安装httpd:
[root@Web1 ~]# yum install -y httpd
[root@Web1 html]# echo web1 > /var/www/html/index.html [root@Web1 html]# systemctl start httpd [root@Web2 ~]# yum install -y httpd
[root@Web2 ~]# echo web2 > /var/www/html/index.html [root@Web2 ~]# systemctl start httpd
####Master上安装lrzsz上传varnish包
[root@Master ~]# yum install -y lrzsz
####将varnish的包放到/usr/local/src/下面,最好养成习惯!!
[root@Master ~]# mv varnish.zip /usr/local/src/
####Varnish是zip格式,需要安装unzip来进行解压:
[root@Master ~]# yum install -y unzip
[root@Master ~]# cd /usr/local/src/ [root@Master src]# unzip varnish.zip
####安装这些RPM,存在先后安装的依赖顺序的:
[root@Master varnish]# rpm -vih jemalloc-3.6.0-1.el7.x86_64.rpm [root@Master varnish]# rpm -vih varnish-libs-4.0.5-1.el7.x86_64.rpm [root@Master varnish]# rpm -vih varnish-4.0.5-1.el7.x86_64.rpm warning: varnish-4.0.5-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY error: Failed dependencies: redhat-rpm-config is needed by varnish-4.0.5-1.el7.x86_64 gcc is needed by varnish-4.0.5-1.el7.x86_64 [root@Master varnish]#
效果图如下:
如上在安装varnish的时候存在报错,是因为没有gcc和redhat-rpm-config;
####先安装gcc和redhat-rpm-config,再安装varbish;
[root@Master varnish]# yum install -y gcc redhat-rpm-config [root@Master varnish]# rpm -vih varnish-4.0.5-1.el7.x86_64.rpm
安装成功效果图 :
2)、利用varnish缓存一个网站;
注释:如上安装之后,再etc下面有同名的目录,default.vcl是vcl的配置文件,varnish.params是主配置文件;
####通过varnish缓存web1:
配置default.vcl,如下:
修改为:
添加deliver:
修改为: 就是一个函数的调用,如下:
配置varnish.params,如下:
修改为:
####启动Varnish
[root@Master varnish]# systemctl start varnish
启动之后,查看80端口已经正常监听;
####在本地访问Master的地址,查看是否能到Web1:
如上,测试缓存成功了,
####使用Curl命令查看缓存来自哪里,以及命中次数,如下:
3)、之前之缓存了web1,如果要缓存多个网站,如下:
首先先修改以下三台设备的hosts本地解析:
将hosts文件利用scp传递给其他两台:
####在Master上先配置default.vcl,如下:
backend 模块中添加web1和web2:
在sub vcl_recv模块中添加如下部分:
注释:添加的内容意思是将缓存的两个网站进行分类,如果访问的是www.zhanggeng.cn就返回Web1,访问bbs.zhanggeng.cn返回Web2。这是通过域名来做的;
####重新启动varnish:
[root@Master varnish]# systemctl reload varnish
####此时在Master上的host文件,不能是192.168.3.201对应varnish,应该如下:
因为我们是使用master来进行测试的跳转到,并没有用我宿主机:
注释:正常访问流程是,客户端访问,然后到达varnish,varnish判断是域名,然后分配给不同的web。
####在master上安装elinks进行测试:
[root@Master varnish]# yum install -y elinks
使用www.zhanggeng.cn域名,出现web1的页面:
[root@Master varnish]# elinks www.zhanggeng.cn
使用bbs.zhanggeng.cn,出现web2的页面:
测试如下:
至此varnish缓存基本上就完成了。