天天看点

varnish 使用进阶

varnish 使用进阶

================================================================================

概述:

 1.state engine:状态引擎切换机制(varnish4.0 )

★request:  vcl_recv   接受请求报文 ★response:  vcl_deliver 发送请求报文 ★处理流程: ①缓存命中 vcl_hash -(hit)-> vcl_hit --> vcl_deliver ②缓存未命中 vcl_hash -(miss)-> vcl_miss --> vcl_backend_fetch --> vcl_backend_response --> vcl_deliver  ③缓存修减(处理,清理) vcl_hash -(purge)-> vcl_purge --> vcl_synth  ④请求不能识别,直接响应到后端,建立一个管道 vcl_hash -(pipe)-> vcl_pipe ★两个特殊的引擎: vcl_init:在处理任何请求之前要执行的vcl代码:主要用于初始化VMODs; vcl_fini:所有的请求都已经结束,在vcl配置被丢弃时调用;主要用于清理VMODs;

 2.vcl的语法格式:

★语法格式 VCL files start with vcl 4.0;             指明版本 //, # and /* foo */ for comments;  单行和多行注释 Subroutines are declared with the sub keyword;   子例程要用sub关键字声明 例如:sub vcl_recv { ...}; No loops, state-limited variables  不支持循环,受限于引擎的内建变量; Terminating statements with a keyword for next action as argument of the return() function, i.e.: return(action); Domain-specific:域专用的配置 ★The VCL Finite State Machine vcl  有限状态机 Each request is processed separately; Each request is independent from others at any given time; States are related, but isolated; return(action); exits one state and instructs Varnish to proceed to the next state; Built-in VCL code is always present and appended below your own VCL; ★三类主要语法:
varnish 使用进阶

示例:

-------------------------------------------------------------------------------

 3.VCL Built-in Functions and Keywords 內建函数和关键字

★函数: regsub(str, regex, sub)      正则表达式替换 regsuball(str, regex, sub)   替换所有 ban(boolean expression)      清理缓存项 hash_data(input)             对指定的数据做哈希计算 synthetic(str)
varnish 使用进阶
★Keywords: call subroutine    调用子例程关键字 return(action)     return关键字,指明下一次的action new set                  设定一个变量值 unset              撤销一个变量值 ★操作符: ==, !=, ~, >, >=, <, <= 逻辑操作符:&&, ||, ! 变量赋值:=

演示:

  通过判断响应报文缓存命中的次数来判断是否命中缓存

 1)因为是响应报文,所以在val_deliver中定义,所以编辑/etc/varnish/default.vcl如下:

varnish 使用进阶

 2)让配置生效需要执行varnish_reload_vcl也可手动执行,如下:

 3)在浏览器中查看,可以发现在http首部添加的首部X-Cache 为HIT,说明为缓存命中的,如下:

varnish 使用进阶

 1.内建变量和用户自定义变量:

★內建变量 ☉req.*:request,表示由客户端发来的请求报文相关; req.http.*    req.http.User-Agent, req.http.Referer, ... ☉bereq.*:由varnish发往BE主机的httpd请求相关; bereq.http.* ☉beresp.*:由BE主机响应给varnish的响应报文相关; beresp.http.* ☉resp.*:由varnish响应给client相关; ☉obj.*:存储在缓存空间中的缓存对象的属性;只读; ★用户自定义变量 set  unset 

 2.常用内建变量:

☉bereq.*, req.*: bereq.http.HEADERS bereq.request:      请求方法; bereq.url:              请求的url; bereq.proto:         请求的协议版本; bereq.backend:     指明要调用的后端主机; req.http.Cookie:    客户端的请求报文中Cookie首部的值;  req.http.User-Agent ~ "chrome"  浏览器的类型被chrome匹配 ☉beresp.*, resp.*: beresp.http.HEADERS beresp.status:               响应的状态码; reresp.proto:                 协议版本; beresp.backend.name: BE主机的主机名; beresp.ttl:                     BE主机响应的内容的余下的可缓存时长; ☉obj.* obj.hits:            此对象从缓存中命中的次数; obj.ttl:              对象的ttl值 ☉server.* server.ip server.hostname ☉client.* client.ip 附图:  变量的使用范围:
varnish 使用进阶

演示1:

  强制对某类资源的请求不检查缓存,这里以login和admin类为例

1)首先在后端主机创建一个login的目录并提供测试页面,如下:

 2)此时请求login中的资源,可以看到第一次是后端主机直接响应的,之后都是命中缓存,由varnish直接响应,如下:

 3)现在,我们定义其请求报文,如果含有login和admin的就不从缓存中响应,编辑/etc/varnish/default.vcl,在vcl_recv定义如下:

varnish 使用进阶

 4)配置生效,执行varnish_reload_vcl或者手动执行,如下:

 5)再次请求发现现在都是从后端主机直接响应的,不在命中缓存,如下:

示例总结:

varnish 使用进阶

--------------------------------------------------------------------------------

    ---purge,ban

★purge: 清理单个url所对应的资源; ★ban: 清理表达式模式匹配到的所有url缓存所对应的资源; ★能执行purge操作
varnish 使用进阶
★何时执行purge操作
varnish 使用进阶
★添加此类请求的访问控制法则:
varnish 使用进阶

  收到用户的请求方法为“purge”然后就执行return purage

------------------------------------------------------------------------------

  1)编辑/etc/varnish/default.vcl,在vcl_recv定义如下:

varnish 使用进阶

 2)配置生效,执行varnish_reload_vcl或者手动执行,如下:

 3)使用curl命令请求,如下:

 4)现在,对能够执行return purge 做acl访问控制,只允许来自本机的网络执行,编辑配置文件如下:

varnish 使用进阶

 配置生效,执行varnish_reload_vcl或者手动执行,如下:

  测试,我这里不使用nginx反代,因为nginx和varnish在同一台主机,所以,用户请求nginx的80服务,是由nignx反代至varnish,而varnish识别的是nginx反代的地址,不是用户的地址,所以这里为了演示效果,不使用nginx反代。然后在远程主机请求,如下: