缘来路过 发表于 2018-5-19 14:03:26

Linux_Varnish_(2)

  官方文档:http://www.varnish-cache.org/#
   
Varnish
   TLS:4.1 4.0

      下载地址:
http://www.varnish-cache.org/releases/install_redhat.html#install-redhat
架构图:
                  
      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 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.vclC语言格式. 配置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

其他变更:

    请参考http://varnish-cache.org/docs/4.0/whats-new/upgrading.html


  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,启动服务;
       直接请求 http://172.16.79.73不经过varnish 首部如下:
继续请求 http://172.16.79.71经过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
  https://www.varnish-cache.org/docs/4.0/users-guide/vcl-syntax.html
  
  (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      (查看状态)
    ********************再次用浏览器查看首部
            http://172.16.79.71    varnish的服务器
            
    X-Cache:MISS    #因为是第一次访问
    第二次访问X-Cache:HIT       ps:为毛我的浏览器跟shi一样坑....别人访问正常
  
页: [1]
查看完整版本: Linux_Varnish_(2)