varnish学习总结

什么是web cache?

  Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在与Web服务器和客户端(浏览器)直接的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。         —–摘自Alloy Team

缓存命中率类型:

  文档命中率:按文档数量进行衡量

  字节命中率:按命中的字节数量进行衡量

缓存处理流程:

        1.png

接受请求:接受来自client的访问请求

解析请求:提取client访问请求的URL中的头部信息

查询缓存:根据提取的头部信息查询缓存数据是否含有客户端访问的请求数据

新鲜度监测:如果缓存数据中含有客户端访问的数据,则检查数据的有效性

创建响应报文:当确定缓存命中的数据有效,则创建响应报文

发送响应报文:当响应报文构建完成之后,发送响应报文给客户端

记录日志:发送响应报文的同时记录日志信息

新鲜度监测的方法:

 1、过期日期或有效性:

   HTTP/1.0:使用Expries定义缓存过期的绝对时间

   例如:Expires:Sat, 18 Jul 2015 03:41:04 GMT 

   HTTP/1.1: 利用Cache-Control定义文档的最大使用期限,是相对时长

     例如:Cache-Control: max-age 1d: 缓存有效期为1天 

 2、服务器再验证:向服务器验证数据是否发送改变

   1)如果原始内容没有改变,则服务器仅响应首部,不附带body部分,响应码为304;

   2)如果原始内容发生改变,则正常响应,响应码为200;

   3)若果原始内容已不存在,则响应码为404,此时缓存也应该清除缓存项;

 3、条件式请求首部:

   If-Modified-Since: 从指定时间之后的时间内,原始内容是否发生啦的改变

   If-None-Match: 每个版本的文档都有一个标签ETag,当内容发生改变此ETag也会发送更改

控制缓存能力:

 服务器端:Cache-Control

  no-store: 不准缓存;

  no-cache: 可以缓存,但在提供给请求者之前必须做新鲜度监测;

  must-revalidate:可以缓存,但在提供给请求者之前必须做新鲜度监测;

  max-age: 最大使用期限

  Expires:过期的绝对时间

客户端新鲜度限制:Cache-Control

 max-stale: 最大失效时间

 max-stale=<s>:指定最大失效时间

 min-fresh=<s>:最短有效时间

 max-age=<s>:最大有效时间

注意:含有private、authentication、cookie等信息最好不要缓存;

varnish介绍:

  varnish以一款开源的、高性能的http反向代理的缓存软件;

 varnishi有两类线程:

  management:

   1)读入配置文件

   2)调用合适类型的存储(有malloc内存、tmp、persisten三种存储类型)

   3)创建/读入相应大小的缓存文件

   4)初始化管理结构体空间

   5)fork并监控child进程

 child/cache:

   1)将打开的存储文件映射进内存空间

   2)创建并初始化空闲的结构体空间

varnish有九个状态引擎,如下图所示:

2.png

varnish配置文件介绍: 

 1)后端节点定义:

  backend name {   } ;

 代理缓存:子进程定义

 sub+状态引擎 {  };

  引擎之间都有相关性,前一个引擎通过return(x)定义退出状态,进而决定继续处理下一个引擎;

 2)vcl:

  vcl是基于“域”的简单编程语言;支持算术运算和逻辑运算,支持正则表达式,支持使用set、unset自定义变量或取消变量,支持if条件判断,有内置的函数和变量;

 配置语法:

  ①注释://单行注释,/*…..*/多行注释

  ②sub $name 定义函数

  ③不支持循环

  ④支持终止语句return,没有返回值

  ⑤域专用

  ⑥操作符:=(赋值)、==(比较)、~(正则)、!(取反)、&&(和)、||(或者)

 3)vcl的内置函数

  regsub(str,regexp,sub):以regexp为模式匹配str,将匹配到的第一个替换为sub

  regsuball(str,regexp,sub):以regexp为模式匹配str,将所有匹配到的都替换为sub

  hash_date(str):做hash计算

  purge:从缓存中挑出某对象并删除

  return(x): 定义退出状态

 

 4)内置变量: 

req内置变量 resp的内置变量 bereq内置变量:

req.request: 请求方法

req.url: 请求的url

req.http.HEARDER: 请求的具体首部

req.restarts: 请求报文重启次数

server.ip: varnish服务器的ip地址

server.port: varnish服务器的端口

clinet.ip: 客户端ip

server.hostname: varnishi服务器名称

req.backend: 请求时交由具体后端服务器

resp.proto: 响应版本协议

resp.status: 响应码

resp.http.HEARDER:响应首部

bereq.url: 请求的url

bereq.request: 请求方法

bereq.http.HEADER: 请求的首部

bereq.connect_timeout: 连接超时时长

bereq.proto:向后端发起请求时使用的协议

beresp内置变量 obj内置变量: 相关说明:

beresp.status: 后端响应码

beresp.http.HEADER: 响应首部

beresp.ttl: 响应ttl值,缓存时长

beresp.backend.ip: 后端主机ip 

beresp.backend.port: 后端端口

beresp.backend.name: 后端主机名

obj.status: 缓存对象响应码

obj.ttl: 缓存时长

obj.hits: 缓存是否命中

obj.http.HEARDER: 命中状态首部

req: 是客户端发起的request

resp:是varnishi响应的response

bereq:是varnish向后端服务器发起请求

beresp:是后端服务器响应给varnish

obj:是缓存对象即将进入缓存

 

varnish配置:

 1)安装

 2)配置varnish服务配置文件

 3)配置varnish主配置文件,添加响应报文首部

 应用此配置:

测试1: 

3.png

测试2:

 4.png

 4)设置缓存时长:

 应用此配置:

 访问测试:

 5.png

 6.png

5)利用varnish自带着函数(purge)清空缓存

 应用此配置文件:

 测试:

相关连接:

https://fr.wikipedia.org/wiki/Cache-Control

https://www.varnish-cache.org/docs/3.0/

原创文章,作者:马行空,如若转载,请注明出处:/6200

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达注册  万达主管  万达主管QQ  万达直属  华宇招商  万达娱乐开户  万达娱乐直属QQ  万达登录  万达娱乐主管  万达娱乐招商