前文我们聊了下varnish的状态引擎和不同类型的变量对应该使用在那个状态引擎中,以及每个状态引擎的对应处理事务;回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12643549.html;今天我们来聊一聊varnish的缓存项修剪;

  什么是缓存项修剪?所谓修剪我个人的理解是把多余的部分或者不需要的部分删除掉;对于varninsh来讲,缓存项修剪也叫缓存项删除;我们在varnish服务器上可以通过vcl语言来编写缓存策略,对于某些缓存该如何缓存,缓存多久等等;假如我们在定义好缓存策略后,在定义缓存过期时间内,后端服务器内容发生了变化,或者后端服务器发生了内容更新,我们如果不把varnish上的缓存修剪掉,对于用户来讲,用户的访问就不是最新的数据;为了解决这样的问题,我们需要人工手动的去修剪缓存项;而修剪缓存项一般都是针对某一类资源或特定资源来做修剪(通过用户指定或正在匹配),一般不会也不应该是全部;在varnish中,修剪缓存的方式有两种,一种是vcl_purge状态引擎修剪(通过判断用户的某些请求首部特征,来对用户指定的资源进行修剪),一种是内部函数ban()来修剪缓存(通常在命令行执行ban命令修剪缓存);

  首先我们来看看varnish的默认配置中如何定义vcl_purge这个状态引擎的;

[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 "vcl.show -v boot"|grep -A3 purge
sub vcl_purge {
return (synth(200, "Purged"));
} [root@test_node1-centos7 ~]#

  提示:从上面默认配置中可以看到对于vcl_purge的配置很简单;以上配置表示如果上一个状态引擎把报文送给purge这个状态引擎后,purge状态引擎的操作就是把对应报文送给synth(),并合成一个200的响应码,消息状态是purged的合成页面响应给客户端;以上就是告诉客户端缓存项修剪成功;

  了解了purge的处理机制后,我们在来看看缓存项的修剪应该在那个状态引擎中定义;通常在接收到用户请求后,就需要修剪缓存;这样用户才可以拿到最新页面;所以我们在定义缓存的修剪操作应该在vcl_recv中定义;比如判断用户的请求方法,如果用户请求的方法是我们自定义的请求方法,我们就把这类请求直接交给purge处理;

  提示:红框中的内容就是来判断用户的请求方法,如果请求方法是“PURGE” 那么就把对应的请求交给purge去处理;

  测试:用curl命令指定特定的请求方法去访问varnish对外提供的页面;通过判断响应报文中,之前我们定义的X-Cache首部的值来判断是否命中缓存;如果我们使用了purge方法后,第二次正常方式访问应该是miss的,第三次访问时hit就表示修剪缓存项成功;

[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29 Type 'help' for command list.
Type 'quit' to close CLI session. varnish> vcl.load test default.vcl
200
VCL compiled. varnish> vcl.use test
200
VCL 'test' now active varnish> quit
500
Closing CLI connection
[root@test_node1-centos7 ~]# curl -I http://192.168.0.99:8000
HTTP/1.1 200 OK
Date: Thu, 09 Apr 2020 04:57:49 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Strict-Transport-Security: max-age=31536000
Last-Modified: Tue, 31 Mar 2020 14:56:54 GMT
ETag: "2f-5a227c743121d"
Content-Length: 47
Content-Type: text/html; charset=UTF-8
X-Varnish: 65541
Age: 0
Via: 1.1 varnish-v4
X-Cache: miss via 192.168.0.99
Connection: keep-alive [root@test_node1-centos7 ~]# curl -I http://192.168.0.99:8000
HTTP/1.1 200 OK
Date: Thu, 09 Apr 2020 04:57:49 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Strict-Transport-Security: max-age=31536000
Last-Modified: Tue, 31 Mar 2020 14:56:54 GMT
ETag: "2f-5a227c743121d"
Content-Length: 47
Content-Type: text/html; charset=UTF-8
X-Varnish: 32772 65542
Age: 3
Via: 1.1 varnish-v4
X-Cache: hit via 192.168.0.99
Connection: keep-alive [root@test_node1-centos7 ~]# curl -X "PURGE" http://192.168.0.99:8000
<!DOCTYPE html>
<html>
<head>
<title>200 Purged</title>
</head>
<body>
<h1>Error 200 Purged</h1>
<p>Purged</p>
<h3>Guru Meditation:</h3>
<p>XID: 65544</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
[root@test_node1-centos7 ~]# curl -I http://192.168.0.99:8000
HTTP/1.1 200 OK
Date: Thu, 09 Apr 2020 04:58:11 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Strict-Transport-Security: max-age=31536000
Last-Modified: Tue, 31 Mar 2020 14:56:54 GMT
ETag: "2f-5a227c743121d"
Content-Length: 47
Content-Type: text/html; charset=UTF-8
X-Varnish: 32774
Age: 0
Via: 1.1 varnish-v4
X-Cache: miss via 192.168.0.99
Connection: keep-alive [root@test_node1-centos7 ~]# curl -I http://192.168.0.99:8000
HTTP/1.1 200 OK
Date: Thu, 09 Apr 2020 04:58:11 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Strict-Transport-Security: max-age=31536000
Last-Modified: Tue, 31 Mar 2020 14:56:54 GMT
ETag: "2f-5a227c743121d"
Content-Length: 47
Content-Type: text/html; charset=UTF-8
X-Varnish: 32777 32775
Age: 3
Via: 1.1 varnish-v4
X-Cache: hit via 192.168.0.99
Connection: keep-alive [root@test_node1-centos7 ~]#

  提示:我们用purge方法去请求对应资源后,再用正常的get方法去获取资源,对应响应报文首部X-Cache的值就变成miss的,说明没用从缓存中命中;再次访问X-Cache的值变成hit,说明从缓存中命中,这是因为第一次缓存修剪后,第二次访问就把该资源缓存到varnish上,再次访问varnish就直接从缓存中给我们响应;

  其实通过请求方法来判缓存项是否该修剪,其实很危险的;就以上面的配置,任何人都可以通过purge方法去修剪缓存,这很显然是不能也不应该的;所以我们还需要限定那些用户可以执行purge方法去修剪缓存;在varnish中添加访问控制法则需要用acl关键指定,然后起一名称,把对应的ip地址或网段地址写进去;如下

  提示:以上就表示定义了一个访问控制法则,其名称叫做allow_purge_method_clients;其中这里面写ip地址需要用双引号引起来,并用分号结束;对于网段地址掩码位数需要写在双引号外;

  定义好访问控制规则后,我们在原有的判断用户请求方法中加入限定IP地址的操作;

  提示:以上红框中的内容表示如果用户请求的方法是PURGE,IP地址不匹配我们指定的ip地址法则,那么就返回合成403响应码给客户;如果匹配就执行purge操作;

  测试:用192.168.0.99这台主机用"PURGE"方法请求修剪和用192.168.0.22这台主机用"PURGE"方法修剪缓存,如果我们定义的缓存策略正确的话,第一台主机应该是可以修剪缓存的,第二台主机会提示不运行修剪缓存,响应403;

  提示:从上面的示例可以看到通过不同ip的主机对varnish发起“PURGE”方法修剪缓存,在自定义访问控制法则中存在的IP就可以通过“PURGE”方法来修剪缓存,相反不再acl控制发展中的IP地址主机,就不被允许修剪缓存;

  以上是通过编写vcl来判断用户的请求方法实现缓存修剪,除此之外varnish还支持内建命令ban来修剪缓存;接下来我们来看看用内建命名ban怎么修剪缓存;

  首先我们可以来查看下ban命令的用法;

  提示:以上就是ban命令的用法,其中field表示用户请求的某些首部,比如req.http.host、req.url等;operaror表示操作符 ,arg表示参数;

  示例:修剪用户请求资源是index.html内容

  提示:以上红框中的内容就相当于判断用户请求的url,如果匹配/index.html,就return(synth(200));意思就是说对用户请求的/index.html的缓存项进行修剪(删除);所以用户再次访问该URL就不会从缓存响应;

  测试:

  提示:把/index.html的缓存项修剪以后,用户再次访问到/index.html资源时,从响应首部就可以知道它没有被缓存命中;说明缓存项修剪时成功的;

  当然在命令行中可以直接使用ban命令修剪缓存,在配置文件中,我们也可以来使用ban函数来对缓存项进行修剪;如下

  提示:以上红框中的内容表示用户的请求方法是BAN  就执行ban("req.http.host == " + req.http.host + "&& req.url ==" + req.url),然后通过synth()合成一响应码为200的页面响应给用户;这里的ban函数参数部分就是一字符串合成;如果用户请求的host是192.168.0.99 ,url是/index.html;那么ban函数参数部分就是req.http.host == 192.168.0.99:8000 && req.url == /index.html ,就相当在命令行执行ban req.http.host == 192.168.0.99:8000 && req.url == /index.html ;这里特别提示“&&”和 “==”号两边必须要有空格,否则会把&&识别成req.http.host的值的一部分;

  测试

  提示:我们在配置文件利用判断用户请求的方法来修剪缓存项,这种方式同PURGE的方式类似,都需要用acl去控制可以执行修剪操作的客户端;通常情况下我们如果是临时修剪缓存项,用ban命令在命令行修剪,很少写在配置文件中,通过特定的请求方法去修剪特定的资源缓存;而PURGE和ban相反,PURGE常用于在配置文件中用特定的请求方法修剪指定的url资源缓存项;

WEB缓存系统之varnish缓存项修剪的更多相关文章

  1. WEB缓存系统之varnish状态引擎

    前文我们聊了下varnish的VCL配置以及语法特点,怎样去编译加载varnish的vcl配置,以及命令行管理工具varnishadm怎么去连接varnish管理接口进行管理varnish,回顾请参考 ...

  2. WEB缓存系统之varnish代理以及健康状态检测配置

    前文我们聊了下varnish的缓存项修剪配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12666406.html:今天我来说一下varnish作为代理服务 ...

  3. WEB缓存系统之varnish基础入门(一)

    前文我们聊了下http协议里的缓存控制机制以及varnish架构组件介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12620538.html:今天我们来聊 ...

  4. Django Cache缓存系统学习--数据库缓存

    Django是动态网站,用户每一次请求页面,服务器都会执行以下操作:数据库查询.渲染模版.执行业务逻辑,最后生成用户可查看的页面.当访问量比较大的时候,会消耗掉大量的资源,这时候就会考虑到缓存问题. ...

  5. 企业级缓存系统varnish应用

    场景 随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常多的粉丝访问网站,你的总监与市场部门开完会后 ...

  6. 关于varnish缓存

    目录 缓存的概念 一.varnish缓存 1. 简介 2. 总体结构 2.1 两个主进程 2.1.1 Management进程 2.1.2 Child/Cacher进程 2.2 Varnish的日志收 ...

  7. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  8. 第十七课:js数据缓存系统的原理

    这一章主要讲的是jQuery的缓存系统的历史发展,以及他自己的框架的缓存系统的实现.都是源码解析. 我就挑几个重点讲下: (1)jQuery的缓存机制的原理 jQuery的缓存机制实现的原理是在元素中 ...

  9. Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

随机推荐

  1. 论nw.js的坑~~~感觉我所有的前端能遇到的坑都踩了一遍

    先总结:nw.js 真特么的...难用...文档,我得先百度才能看的稍微明白点文档......!!!!!!我感觉我所有的前端能遇到的坑都踩了一遍,此文针对前后端分离项目,别的先不说 一.不需要在项目里 ...

  2. NLP自然语言处理入门-- 文本预处理Pre-processing

    引言 自然语言处理NLP(nature language processing),顾名思义,就是使用计算机对语言文字进行处理的相关技术以及应用.在对文本做数据分析时,我们一大半的时间都会花在文本预处理 ...

  3. 《深入理解 Java 虚拟机》读书笔记:虚拟机字节码执行引擎

    正文 执行引擎是 Java 虚拟机最核心的组成部分之一.在不同的虚拟机实现里,执行引擎在执行 Java 代码时可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也 ...

  4. mysql中实现更新数据+1,再次更新数据-1

    $sql="update article set comment=comment^1 where a_id=2"; 这条语句你会发现当你更新comment字段时为1,再次更新时为0 ...

  5. Python操作系统

    一 为什么要有操作系统 (两本书:现代操作系统.操作系统原理,学好python以后再去研究吧~~) 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输 ...

  6. Vue2.0 【第二季】第6节 Component 初识组件

    目录 Vue2.0 [第二季]第6节 Component 初识组件 第6节 Component 初识组件 一.全局化注册组件 二.局部注册组件局部 三.组件和指令的区别 Vue2.0 [第二季]第6节 ...

  7. vquery 一些应用

    // JavaScript Document function myAddEvent(obj,sEv,fn){ if(obj.attachEvent){ obj.attachEvent('on'+sE ...

  8. [项目分享]JSP+Servlet+JDBC实现的云端汽修后台管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/chenlinSir/CloudDemo-servlet 难度等级:简单 基于JSP+Servlet+Jdbc的云端 ...

  9. postman集合测试执行

    postman工具可以运用集合管理接口请求,特别适合某业务流程的集合请求管理. 如果单个请求诸葛send,耗时费力,可以直接以集合运行 一,运行方法: 1,选中集合--点击右侧小箭头--显示页面中点击 ...

  10. iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)

    Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...