Apache中Varnish缓存

    科技2024-04-16  97

    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缓存基本上就完成了。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Processed: 0.013, SQL: 8