官方文档:

    图片 
Varnish
   TLS:4.1 4.0
图片
        下载地址:
架构图:
                    图片
        varnish的配置文件是C语言格式,要想被程序读取,必须把配置文件手动编译成二进制代码(执行一条命令就可以)
        Management每隔几秒钟会探测child/cache进程是否存活,(类似whtch dog) 
        Accept:接收并相应请求,并不负责处理
        Worker threads:负责处理请求,可能存在多进程.每个进程并发响应多请求.
        Log file:不指日志 而是在内存中用来保存日志所生成的工作区 (包括统计数据)
                varnishstat:用来查看统计数据
                varnishncsa/varnishlog:用来查看日志信息
                carnishtop:排名显示
         整个child/cache模块中的进程必须共享数据才能协调工作,这块共享内存则可以成为log file/shared memory log(所以logfile中有锁机制)
                每一个线程要想在log file中写数据 则必须有锁权限
                 
varnish的工作特性:
         当进程启动时,会占用大概90MB的内存空间,形成工作区,主要用来保存日志信息,(采用轮循机制),所以如果要保存日志,必须有进程负责读取工作区的数据并写入到硬盘中, 
      
*************************************************安装步骤*********************
图片
       ]# yum install varnish
************************************varnishde配置
    程序环境 :
    Centos 7:
            /etc/varnish/varnish.params: 配置varnish服务进程的工作特性:
    Centos6
           /etc/sysconfig/varnish*
                大多数操作并不依赖于配置文件 而是基于varnish's command line进行配置和查询
         /etc/varnish/default.vcl:配置child/Cache线程的工作属性:
         主程序:
                /usr/sbin/varnishd
         CLI interface:
                /usr/bin/carnishadmin
        Shared Memory Log 交互工具:
                /usr/bin/varnishhist
                /usr/bin/varnishlog
                /usr/binvarnishncsa
                /usr/bin/varnishstat
                /usr/bin/varnishtop
        测试工具:
                /usr/bin/varnishtest
                varnish_reload_vcl     vcl文件重载程序
启动服务:
    Stsremd Unit :
    /usr/lib/systemd/system/varnish.service
            carnish服务
    /usr/lib/systemd/system/varnishlog.service
    /usr/lib/systemd/system/varrishncsa.service
                日志持久化服务(用于把内存中的文件读取出来保存在磁盘上)用于不同格式的日志
********************************************************************
    varnish缓存数据机制:
           1.malloc[,size]     存储在内存中
           2.file[,parh[,size[,granularity]]] 存储到文件中 单个文件 黑盒机制(和nginx不同 是一个文件 不是bash分级)重启后失效
           3. persistent,path,size    重启后依然有效  在开发阶段 不可用 (黑盒)
 
********************************************************************
    Varnish程序的选项: man varnishd   (配置服务的属性的)
      程序选项:命令行选项
          -a address[:port][,address[:port][...]   在指定的地址上监听请求 默认本机
          -b host[:port] 指明后端服务器 ip地址
          -T   管理接口
          -s [name=]type[,options] : 定义缓存存储机制
          -f 指明VCL配置文件
          -F 运行与前台:
                ... 
      运行时参数:
          -r param[,param..]read only 设定参数只读 
          -p raram=value 设定运行的参数
        大多数参数都有默认值.可以在配置文件 /etc/barnish/varnish.params定义:
          
VARNISH_VCL_CONF=/etc/varnish/default.vcl  配置文件
           VARNISH_LISTEN_PORT=6081     监听端口(代理接口) 如果是前段一级代理 则可改为80端口
           VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1  监听地址(管理)
           VARNISH_ADMIN_LISTEN_PORT=6082     管理监听地址
           VARNISH_SECRET_FILE=/etc/varnish/secret    varnishadmin的与共享密钥
           VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G"    默认缓存存储位置及类型 
           VARNISH_TTL=120   如果后端服务器没指明ttl  默认ttl缓存时常
           VARNISH_USER=varnish    默认运行身份

           VARNISH_GROUP=varnish   组身份

           DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
           其他参数 -p指明  其他项请参考 ]# man varnish
*******************************
    虽然内存速度很快 但久而久之会产生内存碎片  速度下降很严重 所以一般还是基于pcie接口的ssd做磁盘缓存 
 
*******************************
    VCL配置文件: 
default.vcl  C语言格式. 配置cache的工作的机制的:"域"专有类型的配置语言(每个配置端有一个花括号)
         state engine:状态引擎:
         VCL有多个状态引擎,状态之间存在关联性,但彼此隔离 ,每个状态引擎使用return(x)指明
        关联至哪个下一个引擎
   ********************************************较老版本(3.0)的简单处理逻辑
                                图片
   方阔中是状态引擎
   请求处理流程:

    (1) 接收请求:vcl_recv;判断其是否可缓存;

(a) 可缓存:vcl_hash 

(i) 命中:vcl_hit

(ii)未命中:vcl_miss --> vcl_fetch

(b) 不可缓存:vcl_fetch

(2) 响应:vcl_deliver 

vcl_recv --> vcl_hash --> vcl_hit --> vcl_deliver

vcl_recv --> vcl_hash --> vcl_miss --> vcl_fetch -->(有可能先缓存-->) vcl_deliver

vcl_recv --> vcl_fetch --> vcl_deliver     请求的是不可缓存数据  (不可缓存数据 是否做缓存要看规则)

vcl_recv --> vcl_pipe     (客户端请求 varnish理解不了  直接发给后端服务器)

                    

      ******************************************** 3.0版本图2 图片
                
***************************************************************** 完整处理逻辑
            图片 
                          

                 

***********************************************以上为varnish3.0
图片
其他变更:
图片
    请参考  

Varnish 4:vcl状态引擎切换流程;

request: vcl_recv --> vcl_hash 

(1) hit: vcl_hit --> vcl_deliver

(2) pass, hit_for_pass: vcl_pass --> vcl_backend_fetch --> vcl_backend_response --> vcl_deliver

(3) miss: vcl_miss --> [ vcl_pass-->]   vcl_backend_fetch --> vcl_backend_response --> vcl_deliver

(4) purge: vcl_purge --> vcl_synth

(5) pipe: vcl_pipe

(6) busy: vcl_waiting 

两个特殊的引擎:

vcl_init:在处理任何请求之前要执行的vcl代码;主要用于初始化VMODs;

vcl_fini:所有请求都已经结束,在vcl配置被丢弃时调用;主要用清理VMODs; 

 

***************************************************以上为varnish4.X模型**********************
4.
********************************实验过程
    由于实验不使用nginx做反代.所以 varnish为一级代理 
                修改配置文件 /etc/barnish/varnish.params 
                    
 VARNISH_LISTEN_PORT=80 
                修改配置文件  /etc/varnish/defaut.vcl
                            执行命令: varnish_reload_vcl   将配置文件读取
                     修改后端服务器地址为C7R3
                    图片
        
执行命令: varnish_reload_vcl   将配置文件读取
     图片  

       并在C7R3上安装httpd服务,给定主页内容 server test 1,启动服务;

       直接请求   不经过varnish 首部如下:图片
 继续请求   经过varnish 首部如下
        图片 
    代理缓存生效 
       ************************************varnishadmin管理命令
        图片 
    默认配置文件只允许从本机连入 Varnish命令  所以在本机上执行varnishadmin 命令 :
      选项:
        -T 指明Varnish服务器地址 可以不用交互模式
        -S 指明共享密钥
   在本机执行或在授权机执行:
    ]#  varnishadm -S /etc/varnish/secret  -T 127.0.0.1:6082 (在本机可以直接执varnishadmin)
         进入交互式模式 : help查看交互模式下的命令 
                图片
            vcl.list:显示列表    ist可能列出很多版本,但只能激活一个版本
            vcl.load:加载并编译
            vcl.use:激活
            vcl.discard 删除(先反激活)
       运行参数相关:
             param.show -l 显示列表
             param.show <param> 显示指定参数
             param.set < param><value> 设置参数的值
        缓存存储列表
            srorag.list
        后端服务器:
            backend.lish 
***********************************************VCL 文件格式****************

vcl语法格式: vim /etc/varnish/defaut.vcl

(1) 支持注释符//,/*... */, #;

(2) sub $name:定义子例程;sub vcl_recv {...};     通常指的是 cvl的状态引擎

(3) 不支持循环,支持条件判断;

(4) 有大量的内建变量,生效位置有特定要求;

(5) 使用终止语句return,来决定下一个状态引擎;没有返回值; 

(6) 操作符:=,==, !, ~, &&, ||,>, <, >=, <= 

        
 图片
例如修改:

sub vcl_deliver {

    if (obj.hits>0) {         #obj.hits(内奸变量 当前资源的命中次数  真是当次请求 的变量)大于0

set resp.http.X-Cache = "HIT";   #设定resp.http.X-Cache=hit   X-Cache首部不存在就加进去

} else { 

set resp.http.X-Cache = "MISS";      #设定...MISS 

}

}  这样请求资源就可看到是从cache返回的还是从 后端服务器返回的

要想生效配置:
]#varnishadmin 
图片
执行 vcl.load test1 default.vcl    #翻译default.vcl到配置test1
列出当前配置列表 (active 表示当前生效 acailable 表示可用 并未生效)
vcl.use test1 (使用test1 配置)
vcl.list      (查看状态)
    ********************再次用浏览器查看首部
                varnish的服务器
            图片
    X-Cache:MISS    #因为是第一次访问
    第二次访问  X-Cache:HIT       ps:为毛我的浏览器跟shi一样坑....别人访问正常