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)★Keywords: call subroutine 调用子例程关键字 return(action) return关键字,指明下一次的action new set 设定一个变量值 unset 撤销一个变量值 ★操作符: ==, !=, ~, >, >=, <, <= 逻辑操作符:&&, ||, ! 变量赋值:=![]()
varnish 使用进阶
演示:
通过判断响应报文缓存命中的次数来判断是否命中缓存
1)因为是响应报文,所以在val_deliver中定义,所以编辑/etc/varnish/default.vcl如下:
2)让配置生效需要执行varnish_reload_vcl也可手动执行,如下:
3)在浏览器中查看,可以发现在http首部添加的首部X-Cache 为HIT,说明为缓存命中的,如下:
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定义如下:
4)配置生效,执行varnish_reload_vcl或者手动执行,如下:
5)再次请求发现现在都是从后端主机直接响应的,不在命中缓存,如下:
示例总结:
--------------------------------------------------------------------------------
---purge,ban
★purge: 清理单个url所对应的资源; ★ban: 清理表达式模式匹配到的所有url缓存所对应的资源; ★能执行purge操作★何时执行purge操作![]()
varnish 使用进阶 ★添加此类请求的访问控制法则:![]()
varnish 使用进阶 ![]()
varnish 使用进阶
收到用户的请求方法为“purge”然后就执行return purage
------------------------------------------------------------------------------
1)编辑/etc/varnish/default.vcl,在vcl_recv定义如下:
2)配置生效,执行varnish_reload_vcl或者手动执行,如下:
3)使用curl命令请求,如下:
4)现在,对能够执行return purge 做acl访问控制,只允许来自本机的网络执行,编辑配置文件如下:
配置生效,执行varnish_reload_vcl或者手动执行,如下:
测试,我这里不使用nginx反代,因为nginx和varnish在同一台主机,所以,用户请求nginx的80服务,是由nignx反代至varnish,而varnish识别的是nginx反代的地址,不是用户的地址,所以这里为了演示效果,不使用nginx反代。然后在远程主机请求,如下: