varnish

Posted huxl1

tags:

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

第一节

缓存一般是缓存热区的数据(访问量大是数据区)

缓存分为:

      共有缓存:是多个用户共同使用共享

      私有缓存:是独自使用的缓存

局部性:一般缓存热区的数据

时效性:缓存的数据具有时效性,过时还自动清理

缓存命中率:

      页面命中率:基于页面数量衡量

      字节命中率:基于页面大小体积衡量

缓存模式:

      代理缓存:在客户端查询是查询缓存数据,若缓存数据没有时,缓存服务器会代理客户端去服务器端取数据后返回给客户端

      旁观缓存:在客户端查询是查询缓存数据,若缓存数据没有时,需要客户端自己去服务器拿去数据,后有服务器决定要不要进行缓存。

Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓存文件来减少响应时间和网络带宽消耗。

varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,

第二节

缓存有效判断机制:

      过期时间:在响应报文首部给一个过期时间

Cache-Control:   max-age=315360000 

条件式请求控制逻辑:

    当客户请求浏览器,它向请求上级服务器,看上次访问的时间戳多少,若没有改变,则返回304响应吗,浏览器直接缓存响应 (Last-Modified:Mon, 07 Nov 2016 07:51:11 GMT)

若返回200响应吗表改变过更新自己缓存,(Status Code:200 OK)

若不希望从缓存中响应在Cache-Control:no-cache 不从缓存响应

响应报文用于如何缓存的:

    cache-response-directive=

            private   可用公共缓存

            nocache  可缓存但不直接响应 (在响应是必需先进行有效的认证)

            no-store 不允许缓存

            proxy-revalidate  有代理服务器校验

varinsh 架构:

 技术分享图片

 

varnishd是主程序启动后生成两个进程,Manager Process(父进程)和Cacher Process(子进程),前者在启动时读入配置文件(稍后会讲到)并fork()出后者,同时具有CLI接口接收管理员的指令以用于管理后者,后者是真正处理缓存业务的进程,其下又可以生成若干线程,这些线程各司其职,完成缓存业务的处理并记录日志

安装vanish

yum install varnish-libs-3.0.7-1.el7.centos.x86_64.rpm varnish-libs-devel-3.0.7-1.el7.centos.x86_64.rpm varnish-docs-3.0.7-1.el7.centos.x86_64.rpm

 

yum install  varnish-3.0.7-1.el7.centos.x86_64.rpm –y

启动:systemctl status varnish

配置文件:

/etc/varnish

/etc/varnish/default.vcl    配置缓存策略的

/usr/bin/varnishadm    cli配置进程

varnish 的进程:

 

         varinshd    -s[name] type [options]

                            malloc [size] :内存存储 size定义空间大小重启后所有消失

                            file [path[size[granlarity]]] 文件存储重启后时效

                            persistentpathsize   文件存储  重启后缓存有效

yum   info  jemalloc  完成自己的内存分配

配置文件:

default.val   配置缓存策略的

varnish.params   进程配置的工作特性如环境端口

编译安装:

yum install -y automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig

wget http://repo.varnish-cache.org/source/varnish-3.0.4.tar.gz tar 

]# tar -zxvf varnish-4.0.5.tgz

# cd varnish-4.0.5

./configure --prefix=/usr/local/varnish

make&&make  install

报:make: *** No targets specified and no makefile found.  Stop.

将varnish安装目录改为root权限

实验 两台服务器器

rs:web服务器

1 时间同步:

         vim  /etc/chronyd.conf

         systemctl   restart   chronyd.service

         chronys  sources    查看

 

 

varnish  程序选项  /etc/varnish/varnish.params

           -a : 默认端口6081

           -T : 默认管理端口6082  支持远程管理

           -s   : 定义缓存存储机制

           -u:

           -g:

           -f :      定义vcl的配置文件

           -F :运行与前台

运行时的参数设定在/etc/varnish/varnish.param 中最后一行

      DHEMON_OPTS= “-p thread_pool_min=5    -p  thread_pool_max=500  -p  thread_pool_timeout = 300 “

      -p : 设定参数的

      -r param[,param]           设定参数为只读状态

设定varnish.param

 vim /etc/varnish/varnish.param

      VARNISH_LISTEN_PORT=80

      VARNISH_STORAGE= “file,/date/varnish/cache, 1g”

mkdir  /date/varnish/cache

chown –R  varnish.varnish  /date/varnish/cache

systemctl  start  varnish.service

ss –tnlp

2 定义后端服务器

]# vim /etc/varnish/default.vcl

 

重新加载

# varnish_reload_vcl

]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082    开启命令行工具

help   获取帮助

status  状态查看

vcl.list

vcl.show

vcl  配置总结

vcl有多个状态引擎,状态之间存在相关性,但状态引擎彼此间相隔离,每个状态引擎可使用return()指明关联至那个下一级引擎,每个状态引擎对应cvl文件中配置段即为subroutine

技术分享图片

第三节 配置  /etc/varnish/default.vcl

vcl_recv  :                 收到请求

vcl_pass  :                   判定(不能查缓存,可以查缓存)

vcl_hit     :                 命中

vcl_miss  :                     没有命中

vcl_purge:                  清0

 

服务端状态引擎:

      vcl_backend_fetch      取缓存

      vcl_backend_reponse   取得能不能缓存

      vcl_backend_error       错误, 取不到

函数构建:

      regsub   (str,regex,sub)    正则表达式查找替换

      regsuball (str,regex,sub)    全部查找替换

      ban  ( boolean ,expression)   做bash 运算

两个特殊的引擎:

      vcl_init : 在处理任何请求之前要执行vc l 代码,主要用于初始化

      vcl_fini: 所有请求结束在cvl配置被丢弃是调用,主要用于清理

操作符: ==  !=   >  >=    <     <=

逻辑符;  &&   ||   !

内建变量:

      rep.*  :  表示由客户端发来的请求报文相关

           req.url

      bereq.* :  由varnish 发往BE主机的响应报文相关

      resp.*  : 由varnish响应给客户端报文相关

      obj.* : 存储在缓存空间中的缓存对象属性,只读

      beresp  : 由BE主机响应varnish服务器的响应报文

常内变量:

      bereq.request  :    请求方法

      bereq.url   :           请求的url

      bereq.protr :         请求的协议版本

      bereq.backend :     指明调用的后端主机

   req.http.cookie :     客户端的请求报文中cookie 首部值

 

      beresp.status : 响应状态码

      beresp.backend.name    BE主机的主机名

      beresp.ttl     BE主机响应的内容的余下可缓存时长

  

     obj.hits  ; 从缓存中命中次数

      obj.ttl    :  对象ttl值

 

实例: 

      sub vcl_recv  {

           if (req.url ~ “(?i)^/(login|admin)”) {

                 return (pass);

           }

      }   

(?i) 不分大小写

匹配到不查缓存

 在varnishadm  命令行中

      vcl.load   test2  default.vcl

      vcl.use    test2

重新加载

访问:

curl  -I  http://ip/index.html

实例2

sub vcl_recv  {

      if  (req.http.user_Agent  ~  “(?i)curl”) {

           return(synth(405));

       }

}

用curl访问  拒绝访问

实例3

对特定类型资源,列入公开的图片等,取消其私有标识,并强行设定其可以由varnish缓存时长。

vcl_backend_response  {

      if (beresp.http.cache-contorl  !~  “s-maxage”)  {

           if  (bereq.url  ~  “(?i) .(jpg|png|gif)$”)  {

                 set  beresp.ttl=3600s;

                 unset beresp.http.set-cookie;

             }

      }

}

第四节 缓存对象的修建

手动清理缓存 ;基于purge ,  ban    来清理

purge: 用vcl_purge  来定义让那些对象让缓存中清除

ban:用ban() 函数  通过正则表达式模式来从缓存中移除

实例:

定义purge

sub  vcl_purge  {

      return (synth(200,”purged”));

}

调用:

sub  vcl_recv  {

      if (req.method=”purge”)  {

           return(purge);

      }

}

重新加载:

vcl.loal    test7   default.vcl

vcl.use  test7

访问:

curl  -I  http://192.16.0.6/index.html

curl  -x  http://192.16.0.6/index.html    -x  如果命中缓存,就将缓存删除

对 purge  做控制:

实例2

acl   purgers   {

      “172.0.0.0”/8;                                     只允许这个网段做purgers

      “192.168.0.0”/24;

}

 

sub  vcl_recv  {

      if (!client.ip  ~ purgers)  {

           return (synth(405  “purges  not  allowed  for  client.ip”));

    }

           return(synth(200,”purged”));

}

 

访问:  curl     -x   PURGE  http://ip/index.html

ban 实例   临时按需清理的在命令行下进行输入

varnish> ban req.url ~ ^/javascripts

200

ban req.url  ~ .js$

200

ban req.url == 1 && req.http.host ~ "ilinux.io"         清空一个域的缓存

200

也可以配置配置文件:

sub  vcl_recv  {

      if (req_method == “BAN”)  {

           ban (“req.http.host == “+req.http.host+” && req.url == “req.url” ”);

           return (synth(200,”ban added”));

      }

}

访问:curl   -x   ban   http://ip/index,html

如何在代理后端多台主机服务器

用directors  功能  需要加载director模块   :import   directors

定义后端主机:

backend   one  {

      host = “localhost”;

      port = “80”;

}

定义组

 

sub  vcl_init  {

      new  组名 = directors.round_robin();

      组名.add_backend (one);

}

或者用random()来定义

      new  random_director = director.random();

      random_director.add_backend(one,10);

      random_director.add_backend(two,5);

 

调用:

sub  vcl_recv  {

      set  req.backend_hint=组名.backend();

实例: 动静分离

定义主机:

backend  lmgsrvl  {

      host = “192.168.10.11”;

      post = “80”;

}

backend  lmgsrvl2  {

      host = “192.168.10.12”;

      post = “80”;

}

 

backend  appsrvl  {

      host = “192.168.10.21”;

      post = “80”;

}

backend  appsrvl2  {

      host = “192.168.10.22”;

      post = “80”;

}

定义组:

sub  vcl_init  {

      new imgsrvs= directors.random();

      imgsrvs.add_backend(imgsrv1,10);

      omgsrvs.add_backend(imgsrv2,20);

 

      new appsrvs = directors.round_robin();

      appsrvs.add_backend(appsrvl1);

      appsrvs.add_backend(appsrvl2);

}

调用:

sub  vcl_recv  {

      if (req.url ~  “(?i).(jpg|jpeg|png)$”)  {

           set req.backend_hint = lmgsrvs.backend();

      }else {

           set req.backend_hint=appsrvs.backend();

      }

}

 

实例3 也可以基于cookie的回话

主机定意

定义组:

sub  vcl_init  {

      new h = directors.hash();

      h.add_backend(one,1);

      h.add_backend(two,1);

}

调用:

sub  vcl_recv  {

      set  req.backend_hint= h.backend(req.http.cookie);

}

 

实例4 对后端做健康检查  用probe 来定义

backend   one  {

      host= “192.168.0.103”;

      probe={

           .url=”/”     ;      对/发动检查

           .timeout=1s    ; 超时时长

           .interval=4 s  ;    每多久发动一次检查

           .window=5;        基于几次

           .treshold=3 ;     折几次中至少有3次成功

}

也可以单独定义probe   再调用

probe    www   {

      .url=”/”     ;      对/发动检查

      .timeout=1s    ; 超时时长

      .interval=4 s  ;    每多久发动一次检查

      .window=5;        基于几次

      .treshold=3 ;     折几次中至少有3次成功

 

}

调用 :

backend    one  {

      host=”192.168.0.1”

      .probe=www;

}

backend.list      命令可以查看

第五节性能参数

# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082    命令行

param.show [-l] [<param>]

param.set <param> <value>

     thread_pools       2               线程池数量默认2

      thread_pool_add_delay      0     新增线程数

      thread_pool_fail_delay        0.2   创建失败时隔多久重新创建线程

      thread_pool_max           5000      最大线程数

      thread_pool_min            100          每个池最小线程数

      thread_pool_timeout      300s      空间线程超时时长超出会被杀掉

time计数器参数:

      connect_timeout        3s 

      first_byte_timeout      60s

      send_timeout             600         发送响应客户端的超时时长

      timeout_idle                5              保持连接的超时时长

      timeout_req             2                客户请求报文的首部的超时时长

日志区域:

      前一部分:varnishstat     查看计数统计

      后一部分:varnishlog     查看实时的日志内容

                 varnishncsa

                 varnishtop      排序显示

做压力测试

ab   -n   100    -c   10   http://ip

命令:

varnishstat    -1    -f   MAIN.cache_hit  

           -1   显示一次  显示所有内容

           -f        指定查看选项

 常查看的有:

      MAIN.threads              400           一共多少的线程

      MAIN.cache_hit            235         命中数

      MAIN.client_req           297           请求数

varnishtop   命令

           -I                     过滤单独标签

           -x   ----             排除----    后显示

           -T   ^resp  (正则表达式)     

启动日志进程:

systemctl   start    varnishncsa.service

systemctl   enable   varnishncsa.service

查看文件

tail    /var/log/varnish/varnishncsa.log

 

以上是关于varnish的主要内容,如果未能解决你的问题,请参考以下文章

代理服务器反向代理varnish配置文件解析