varnish页面缓存代理服务详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了varnish页面缓存代理服务详解相关的知识,希望对你有一定的参考价值。

一、Web缓存

 1.web缓存

      web缓存是可以自动保存常见文档副本的HTTP设备。当Web请求抵达缓存时,如果本地有"已缓存的"副本,可以从本地的存储设备而不是原始服务器设备中提取这个文档。

     通过key-value键值方式缓存,key中保存了URL路径,value中保存了web内容,其均使用hash格式,算法保证能在海量数据中快速命中缓存内容

   (1)缓存优点

           1) 减少冗余的数据传输,节省带宽

           2) 缓解网络瓶颈问题,无需耕宇宽带就能更快的加载页面

           3) 降低对原始服务器的要求,服务器可以更快的响应避免过载

           4) 降低了距离时延

   (2)相关术语

缓存命中

cache hit,可以用已有的副本为某些到达缓存的请求提供服务

缓存未命中

cache miss,无缓存命中副本,被转向后端原始服务器

HTTP再验证

revalidation,新鲜度检测,缓存副本和原始服务器上的数据要不时的进行检测是否为最新

命中率

cache hit rate,缓存提供服务的请求所占的比例,命中率在0-1之间,通常用百分数描述

      注意:

1) 命中率可以分为:文档命中率(从文档个数进行衡量)字节命中率(从内容大小进行衡量)

2) 缓存对象由其生命周期,需要定期清理

3)当缓存空间耗尽,会采用LRU(最近最少使用算法)进行覆盖

4)不是所有的数据都能够缓存,如首部AuthorizationCookieVary:accept-encoding=  … ...

   (3)缓存处理的步骤:

          接收请求 -->解析请求(提取请求的URL及各种首部) --> 查询缓存 --> 新鲜度检测 --> 创建响应报文--> 发送响应 --> 记录日志

 

 2.HTTP首部缓存控制机制

    Cache-Control: no-store禁止缓存对响应进行复制

    Cache-Control: no-cache可以存储在本地缓存区域中,只是在于原始服务器进行新鲜度在验证之前缓存不能提供给客户端使用

    Cache-Control:must-revalidate严格遵循过期信息,在实现没和服务器再验证不提供对象旧的副本。新鲜度检测失败返回504

    Cache-Control: max-age读秒,仅适用于公共缓存

    Expries日期首部到响应中,指明具体时间,不推荐使用

    不添加过期信息,让缓存确定自己的过期日期

   (1)新鲜度检测机制

          HTTP协议的报文首部会对web作出首部定义,通过首部的报文对比来做新鲜度检测。HTTP/1.0 Expires定义的是绝对时间,当达到指定的日期时间的时候,缓存失效;HTTP/1.1 Cache-Control:max-age=#定义的是相对时间,记秒,已解决HTTP/1.0协议在解决全球性数据缓存检测时各地区时差产生的问题

实例:

HTTP/1.0 ExpiresThu, 04 Jun 2015 23:38:18 GMT

HTTP/1.1Cache-Control:max-age=600

   (2)有效性再验正:revalidate

          如果原始内容未改变,则仅响应首部(不附带body部分),响应码304(Not Modified)

          如果原始内容发生改变,则正常响应,响应码200;

          如果原始内容消失,则响应404,此时缓存中的cacheobject也应该被删除;

    说明:

          相关条件式请求首部:If-Modified-SinceIf-Unmodified-SinceIf-MatchIf-None-Match:

If-Modified-Sicce:<date>

如果从指定日期之后文档被修改了,就执行请求的方法。可以与Last-Modified(最后被修改)服务器响应首部配合使用,只有在内容被修改后与已缓存版本有所不同时候采取获取内容

If-None_Match<tags>

标签,如果一缓存标签与服务器文档中的标签不同,If-None_Match首部就会执行请求的方法

  HTTP缓存报文实例:

Cache-Control   = "Cache-Control" ":"1#cache-directive

    cache-directive = cache-request-directive

         | cache-response-directive

    cache-request-directive =

           "no-cache"                         

         | "no-store" (backup)                         

         | "max-age" "="delta-seconds        

         | "max-stale" ["=" delta-seconds ] 

         | "min-fresh" "="delta-seconds     

         | "no-transform"                     

         | "only-if-cached"                  

         | cache-extension                  

     cache-response-directive =

           "public"                              

         | "private" [ "="<"> 1#field-name <"> ]

         | "no-cache" [ "="<"> 1#field-name <"> ]

         | "no-store"                           

         | "no-transform"                        

         | "must-revalidate"                    

         | "proxy-revalidate"                   

         | "max-age" "="delta-seconds           

         | "s-maxage" "="delta-seconds          

         | cache-extension

 

  3.常见的缓存服务开源解决方案

软件

存储模式

性能

配置复杂度

purge效率

共享存储

squid

硬盘

较高

简单

可以并联,但是配置复杂

varnish

硬盘/内存

比较简单

不能

    说明:  

        Squid,很古老的反向代理软件,拥有传统代理、身份验证、流量管理等高级功能,但是配置太复杂。优势在于完整的庞大的cache技术资料Squid在大规模负载均衡场景下很稳定

        Varnish是新兴的一个软件,设计简单,基于内存缓存,重启后数据将消失。

   (1)varnish对比squid的优点

           1)varnish稳定性很高,两者在完成相同负荷的工作时,squid服务器发生故障的几率要高于varnish,因为squid要经常重启

           2)varnish访问速度更快,其采用了"Visual PageCache"技术,所有缓存数据都直接从内存中读取,而squid是从硬盘读取,因而varnish在访问速度方面会更快

           3)varnish可支持更多并发连接,因为varnish的TCP连接释放要比squid快,因而在高并发连接情况下可以支持更多TCP连接

           4)varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而squid是做不到的。

           5)squid属于单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求

   (2)varnish对比squid的缺点

           1)varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大的压力

           2)在varnish使用中,如果单个vrl的请求通过HA/F5,每次请求不同的varnish服务器时,被请求的varnish服务器都会被穿透到后端,而同样的请求会在多台服务器上缓存,也会造成varnish的缓存资源浪费,也会造成性能下降

 

 

 

 

二、Varnish缓存概述

 1.varnish程序架构

      varnish是高性能开源反向代理服务器,http加速器。官方网址:www.varnish-cache.org。版本:v2v3v4

  架构图:

      主要运行两个进程:Management进程和Child(Cache)进程

技术分享

   (1) Management管理进程

         主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会定期探测Child进程。若在指定时长未得到Child进程回应,会重启此Child进程。

         配置文件是VCL编程语言格式,定义缓存工作功能的,VCL编译器需要调用C编译器编译后成varnish能加载的格式才能使用

   (2) Child(Cache)进程

            Child进程包含多种类型的线程,主要用于用户请求管理和缓存管理

Acceptor:接收器,接收新的连接请求并响应;

Worker:处理用户请求

Expiry:从缓存中清理过期缓存内容

cache-worker线程

cache-main线程:此线程只有一个,用于启动caceh;

ban luker:缓存清理线程

acceptor:接收线程

epoll:线程池管理器

expire:清理过期缓存

    注意:

          Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。

   (3) VCLC编译器

           VCL编写的缓存策略保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用

           VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后,management负责将其连接至varnish实例,即child进程。

   (4) 调用接口

            CLIInterface(命令行接口)telent Interface(文本协议不安全)web Interface(商业)

   (5) varnish log file日志

          1) 共享内存日志(shared memory log):日志保存在内存中的共享空间,大小一般为90M,其分为两部分,前一部分为计数器,后半部分为客户端请求的数据如果某线程需要记录信息,其仅需要持有一个锁,而后向共享内存中的某内存区域写入数据,再释放持有的锁

          2) varnish log在内存中实现日志保存,默认不能长久保存,会循环保存

          3) varnish提供多个工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并以指定的方式进行显示。

 

  2.VCL配置缓存策略工具

      Varnish Configuration Language (VCL)

(1)基于“域”(domain specific)的简单编程语言

(2)支持有限的算术运算和逻辑运算操作

(3)允许使用正则表达式进行字符串匹配

(4)允许用户使用set自定义变量

(5)支持if判断语句

(6)支持内置的函数和变量等。

 

  3.varnish存储类型

       (1)file单个文件;不支持持久机制

                使用特定的文件存储全部的缓存数据,并通过操作系统的mmap()系统调用将整个缓存文件映射至内存区域

       (2)malloc:内存方式

    使用malloc()库调用在varnish启动时向操作系统申请指定大小的内存空间以存储缓存对象;

       (3)persistent(experimental):基于文件的持久存储

                与file的功能相同,但可以持久存储数据(即重启varnish数据时不会被清除);仍处于测试期;

  注意:

    1) file存储方法在varnish停止或重启时会清除数据varnish无法追踪某缓存对象是否存入了缓存文件

    2) persistent仅适用于有巨大缓存空间的场景目前尚无法有效处理要缓存对象总体大小超出缓存空间的情况,

    3) 建议在内存空间足以存储所有的缓存对象时使用malloc的方法,反之,file存储将有着更好的性能的表现。

    4) 对于100万个缓存对象的场景来说,其使用的缓存空间将超出指定大小1G左右。另外,为了保存数据结构等,varnish自身也会占去不小的内存空间。

 

 

 

三、安装启动varnish服务

  1.安装相关程序包

    [[email protected] ~]#yum install -y  gcc  varnish-3.0.4-1.el6.x86_64.rpm varnish-docs-3.0.4-1.el6.x86_64.rpmvarnish-libs-3.0.4-1.el6.x86_64.rpm varnish-libs-devel-3.0.4-1.el6.x86_64.rpm

  说明:

      1) gcc编辑器是varnish编译val语言所需的依赖组件

      2) varnish提供程序的主包、varnish-libs提供程序相关的库,必须安装

      3) varnish-libs-devel提供二次开发所依赖的库文件、varnish-docs提供varnish帮助文档,可以视情况安装

 

  2.配置varnish启动时脚本配置文件/etc/sysconfig/varnish

       [[email protected] ~]# vim /etc/sysconfig/varnish

NFILES=131072

打开的最大文件数

MEMLOCK=82000

锁定共享内存大小

NPROCS="unlimited"

最大线程数,无限制

RELOAD_VCL=1

自动重新装载缓存策略,1表示脚本启动自动重新装载缓存策略配置文件

VARNISH_VCL_CONF=/etc/varnish/default.vcl

默认的缓存策略配置文件

VARNISH_LISTEN_PORT=6081

默认监听端口,一般改为80端口

VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1

管理员management进程管理地址

VARNISH_ADMIN_LISTEN_PORT=6082

管理员management进程管理端口

VARNISH_SECRET_FILE=/etc/varnish/secret

启动装载的密钥文件位置,域共享密钥

VARNISH_MIN_THREADS=50

最少线程,启动时最骚启动的空闲进程

VARNISH_MAX_THREADS=1000

最大启动进程,最多不能超过5000个并发

VARNISH_THREAD_TIMEOUT=120

线程超时时长

VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin

缓存文件存放文件(二进制文件)

VARNISH_STORAGE_SIZE=1G

缓存大小

VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"

缓存类型和大小

VARNISH_TTL=120

当后端主机不是指定的时候使用超时时长

DAEMON_OPTS="-a  ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \

             -f ${VARNISH_VCL_CONF} \

             -T  ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \

             -t ${VARNISH_TTL} \

             -w  ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \

             -u varnish -g varnish \

             -S ${VARNISH_SECRET_FILE} \

             -s ${VARNISH_STORAGE}"


注意:

    以下配置必须修改:VARNISH_LISTEN_PORT=80,一般改为80端口,响应http请求,做为web缓存

    VARNISH_STORAGE,一般在大规模图片缓存时候可以为file,但时硬件上最好是固态硬盘

 

  3.启动服务

       [[email protected]~]# service varnish start

 

 

 

四、varnish命令行管理工具

  1.varnishadm:登录命令行终端

        命令语法:varnishadm[-t timeout] [-S secret_file] [-T address:port] [-n name] [command [...]]

     [[email protected]~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082

技术分享

  varnish> help

vcl.list

查看配置文件

vcl.load

重新编译加载vcl配置,需要指明自定义版本名称,和需要编译的文件default.vcl位置(相对)

vcl.use

使用编译的配置文件,指明自定义版本名称

vcl.show

显示指定的配置文件详细信息,指明自定义版本名称

vcl.discard

手动清理版本,否则旧版本配置信息会在varnish重启后丢弃

 

2.varnish的param(参数)查看及设置

     param.show[-l] [param]

     param.set[param] [value]

varnish通过线程池模型定义其最大并发连接数:

thread_pools

线程池个数;默认为2;

thread_pool_max

线程池内允许启动的最多线程个数;

thread_pool_min

启动时要启动的线程数;

thread_pool_purge_delay

清理线程的时间长度,最小不能100毫秒

thread_pool_stack

工作线程栈,默认为-1unlimited,不做限制

thread_pool_timeout

超时时长,多于thread_pool_min的线程空闲此参数指定的时长后即被purge

thread_pool_wokerspace

工作空间,默认使用内存65536字节

 

  3.varnishtop: 内存日志区域查看工具

-Iregexp: 仅显示被模式匹配到的条目

-Xregexp:仅显示不被模式匹配到的条目

-C:忽略字符大小写;

-d:显示已有日志;

    varnish>varnishtopUser-Agent

  显示结果实例:

RxHeader User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko)Chrome/43.0.2357.81 Safari/537.36

     说明:

RxHeader:称为tag,基于tag过滤,可使用-i或-x选项;

User-Agent起始的内容:称为日志信息,可使用-I或-X选项进行过滤;

 

  4.varnishstat:varnish数据统计工具

-f field, field, …:指明显示的字段

-l:列出所有可用字段

-x:xml输出格式

-j:json输出格式

 

 

 

五、VCL状态引擎制定缓存策略

 1.varnish状态引擎

       varnish内部有几个所谓的状态(state),在这些状态上可以附加通过VCL定义的策略以完成相应的缓存处理机制,因此VCL也经常被称作“域专用”语言或状态引擎,“域专用”指的是有些数据仅出现于特定的状态中。

      状态之间具有相关性,但彼此间互相隔离,每个引擎使用return(x)来退出当前状态并指示varnish进入下一个状态。

  

以上是关于varnish页面缓存代理服务详解的主要内容,如果未能解决你的问题,请参考以下文章

缓存varnish配置详解

web缓存服务器varnish-4.1.6的部署及配置详解

高性能Web服务之varnish应用详解及实战应用

缓存varnish的管理及配置详解

varnish页面缓存服务

varnish页面缓存服务