首页 > 代码库 > 性感的开源软件Varnish-基础知识篇

性感的开源软件Varnish-基础知识篇

  此博文针对varnish3.x系列,有些知识不适合最新的varnish4.x,望广大博友知晓;

  本次只有基础知识跟介绍,详细的安装、生产引用后面一一呈现!!!

一、varnish简介

    varnish是一款高性能、配置灵活、管理方便的代理缓存软件,在缓存软件中它与传统的squid相比是一个新贵,具有配置灵活、运行速度快、管理更加方便等优点.

二、varnish的软件架构系统介绍:

    1.  varnish的软件系统架构类似于Nginxmaster-workervarnish主要有两个进程:managementchild进程;

    2. management进程主要的功能是:应用新的配置,管理编译器编译vcl配置文件,监控varnish child进程状态、初始化varnish以及提供一个varnish的命令行接口;

    3. child进程,也常被称之为cache进程,每个child进程中包含有很多线程,常见的线程主要有:

       acceptor线程:主要负责接收新的请求并相应;

      worker线程:child进程会为每个会话分配一个worker线程

      Expiry线程:从缓冲中清理过期的内容

     4. varnish的工作架构图:   wKiom1PrAUSTjGLIAAIKIgDEuCg394.jpg

三、varnish的配置语言VCL:

    1. varnish的配置文件采用了varnish自己独特的配置语言VarnishConfiguration Language (VCL)VCL是一种简单的编程语言,仅支持有限的算术运算和逻辑运算操作,支持正则表达式进行字符串的匹配、允许用户使用set自定义变量、支持if判断语句,但是不支持循环语句;

    2. varnish需要通过management将其转换成C代码,再有GCC编译器将C代码编译成二进制文件才能被varnish进程所调用使用;

    3. management在将vcl转换成C代码的时候会去检测vcl语法的正确性,如果不正确的会抛出错误并且不去转换,有效的避免了装载错误配置文件的风险;

    4. VCL语法:

        1). //#/* comment */用于注释;

        2). sub$name 定义函数;

        3). 不支持循环,有内置变量;

        4). 使用终止语句,没有返回值;

        5). 域专用;

        6)操作符:=(赋值)==(等值比较)~(模式匹配)!(取反)&&(逻辑与)||(逻辑或);

四、varnish的日志功能:

    1. varnish有记录日志的功能,但是它的特殊之处在于varnish的日志是存储在内存里面的,默认为内存保留的空间为90M,超过90M就会清楚最起初的日志记录新日志;

    2. 要想获取日志信息,我们可以通过命令接口的方式或者工具去获取日志,这样的工具有varnishlogvarnishncsavarnishstat;

    3. varnish的日志分为两部分,第一部分是计数器,第二部分为客户端请求的数据;

五、varnish缓存对象的存储:

    varnish支持将缓存的对象存储在不同的介质中,我们可以在varnish启动的使用使用-s选项来指定缓存的存储类型;

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

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

        persistent:与file的功能相同,但是它可以实现持久存储,但是这个功能目前还尚不稳定,处于测试期;

    根据官方资料记载,每个缓存对象会大约多占用1K左右的存储空间,所以大约没100万个对象就会多占用1G的空间(处于性能跟稳定性方面考虑,推荐使用malloc);

六、varnish的几个重要的内置函数

vcl_recv

       vcl_recv是在varnish完成对请求的报文的解码为基本数据结构后第一个要执行的子例程,它的主要作用有:

       1. 修改客户端的数据以减少缓存对象的差异性,比如删除URL中的www字符等;

       2. 基于客户端数据选用缓存策略,比如仅缓存特定的URL请求,不缓存POST请求等;

       3. web应用程序执行URL重写规则;

       4. 挑选合适的后端web服务器;

       注:vcl_recv也可以通过精巧的策略完成一定意义上的安全功能,以将某些特定的攻击扼杀于摇篮中。同时,它也可以检查出一些拼写类的错误并将其修正等;

       varnish默认的vcl_recv函数主要有两个功能:仅处理可以识别的http方法,并且只缓存GETHEAD方法的http请求,不缓存任何用户特有的数据;

vcl_fetch

       vcl_fetch根据服务器端的响应做出缓存的策略,在任何的VCL状态引擎中返回的PASS操作都由vcl_fetch进行后续的处理,vcl_fetch中有很多内置的变量比如最常见的用于定义某对象缓存时长的beresp.ttl变量

       注:默认的vcl_fetch放弃了缓存任何使用了Set-Cookie首部的响应      

vcl_pipe

       此函数在进入pipe模式的时候被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不改变的内容返回客户,知道这个链接被关闭     

vcl_pass

       将请求直接传递到后端主机,后端主机在应答数据后将应答数据发送给客户端,但不会进行缓存,所以在当前这种链接的情况下每次返回的都是最新的内容

vcl_hit

       如果在执行完成lookup之后,在缓存中找到了请求的内容,那么会自动调用这个函数

lookup

       在缓存中查找是否有请求的对象,并且根据结果把控制权交给vcl_hit(有结果)或者vcl_miss(没结果)      

vcl_miss

       执行lookup之后,如果没有在缓存中找到请求的对象,就调用这个函数,这个函数可以判断是否需要从后端服务器获取内容 

vcl_deliver

       如果lookup在缓存中找到的请求的对象,在将缓存的内容返回给客户端的时候会调用这个函数

七、varnish的状态引擎流程图:

wKioL1PrBe3Su1G4AAOKPdMpI6I394.jpg

八、varnish简易的内部处理流程:

wKiom1PrBWHB5tADAAGxGwHC1Yk361.jpg

九、varnish常见的环境变量:

变量名称

变量的意义

.host

后端服务器的主机名或者IP地址

.port

后端服务器的服务名称或者端口号

client.ip

客户端的IP地址

srever.hostname

服务器的主机名

server.ip

服务器端的IP地址

req.request

http请求的类型,如GET/HEAD/POST

req.proto

客户端发起的http协议的版本

req.http.header

请求重启的次数

beresp.request

后端服务器请求的类型,如get/head/post

beresp.url

请求的url地址

beresp.proto

发起请求的http协议的版本

beresp.ttl

最大缓存时长,以秒为单位

obj.status

返回内容的请求的http状态码,如200500404403等;

本文出自 “燕十三” 博客,请务必保留此出处http://yanshisan.blog.51cto.com/7879234/1539390