varnish实现缓存对象及反代后端主机

一、varnish软件

1、概述

  • (1)Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓存文件来减少响应时间和网络带宽消耗。
  • (2)由于varnish先进的设计理念,性能要比古老的缓存服务器squid高上许多,varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失。
2、工作结构
varnish实现缓存对象及反代后端主机_第1张图片
varnish结构
  • (1)varnish是基于现代设备设计的服务项目,所以仅支持64位系统。Manager Process 负责处理请求任务,保证每个任务分配一个worker threads。所以varnish是一个重线程型服务。除此之外,manager process 包含接受CLI命令控制的功能,包括调整运行参数,vcl配置更新。初始化子进程Cacher Process,并按一定频率检测cacher在线与否。

  • (2)Cacher Process 功能:
    监听客户端请求、管理worker 线程、存储缓存数据、记录流量日志、根据统计更新计数器数值。

  • (3)varnish使用工作空间减少每个线程需要请求或者修改内存时发生的争抢。varnish具有多个工作空间,最为重要的是 session 工作空间,用来维护session 相关数据。

  • (4)在日志记录方面,Cacher process 使用VSL 机制来处理,这是一个共享内存空间,可以有效减少记录阻塞。日志空间分为两个部分,分别记录格式化的请求日志,以及计数器数值。可以通过varnish自带log工具进行查看,分析或者永久存储日志。

3、varnish的缓存存储机制( Storage Types):

  • (1) malloc[,size]
    调用malloc(),为缓存分配内存空间,此种方式不可避免地会产生碎片文件,额外占用内存

[,size]用于定义空间大小;重启后所有缓存项失效;

  • (2) file[,path[,size[,granularity]]]
    varnish创建一个文件用来存储缓存数据,然后将此文件映射到内存空间中,但是该文件并不会持久保存数据,重启后所有缓存项失效;

granularity 递增大小

  • (3) persistent,path,size
    持久文件存储,黑盒;重启后所有缓存项有效;但是处于实验阶段,问题较多;
  • (4) MSE

Massive Storage Engine,在plus版可用,意味着收费。该模式设计的容量巨大可达100TB,磁盘性能要优于file模式。

当内存空间不足以存储所有缓存数据时,应选择file 或 mse 存储。所以一般配置成file存储,当然付费的话使用mse更佳。

4、Varnish程序环境

本文主机环境为CentOS7.0,Varnish 版本 4.0

(1)、varnish的程序环境:

/etc/varnish/varnish.params: 配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制;
  /etc/varnish/default.vcl:配置各Child/Cache线程的工作属性;
主程序:
  /usr/sbin/varnishd

  • CLI interface:
      /usr/bin/varnishadm
  • Shared Memory Log交互工具:
      /usr/bin/varnishhist
      /usr/bin/varnishlog
      /usr/bin/varnishncsa
      /usr/bin/varnishstat
      /usr/bin/varnishtop
  • 测试工具程序:
      /usr/bin/varnishtest
  • VCL配置文件重载程序:
      /usr/sbin/varnish_reload_vcl
  • Systemd Unit File:
      /usr/lib/systemd/system/varnish.service #varnish服务
      /usr/lib/systemd/system/varnishlog.service #logger daemon
      /usr/lib/systemd/system/varnishncsa.service #lgger daemon in apache format
(2)、 varnishd 主程序的选项:
  • systemd方式启动varnish 服务,主程序指定的配置文件为:/etc/varnish/varnish.params
      -a address[:port][,address[:port][...],默认为6081端口; #对客户端开放的监听端口地址
      -T address[:port],默认为6082端口; #管理工具连接的端口地址
      -s [name=]type[,options],定义缓存存储机制; #可以多次定义此项
      -u user
      -g group
      -f config:VCL配置文件;
      -F:运行于前台;
      ...
(3)、线程相关的参数:

在线程池内部,其每一个请求由一个线程来处理; 其worker线程的最大数决定了varnish的并发响应能力;

  • thread_pools:Number of worker thread pools. 线程池数量,默认值为2,官方介绍2个线程池已足够用,再增加该数值没有提升效果;
  • thread_pool_max:The maximum number of worker threads in each pool.每个线程池创建最大线程的数量;默认5000
  • thread_pool_min:The minimum number of worker threads in each pool. 每个线程池保持最少线程的数量;额外意义为“最大空闲线程数”;默认100

所以我们经常需要调整的参数就是thread_pool_max,thread_pool_min
计算varnish最大并发连接数=thread_pools * thread_pool_max

  • thread_pool_timeout: 线程空闲时间,超过阈值则摧毁线程
  • thread_pool_add_delay:创建一个新线程的延迟时间,默认值为0s
  • thread_pool_destroy_delay:摧毁一个线程的延迟时间,默认值为2s;
(4)、设置方式:
  • 运行动态修改通过varniadm接口设置
    命令:param.set

  • 永久有效的方法:
    运行时参数:/etc/varnish/varnish.params文件, DEAMON_OPTS

-p param=value:设定运行参数及其值; 可重复使用多次;
  -r param[,param...]: 设定指定的参数为只读状态
 
 例如: DAEMON_OPTS="-p thread_pool_min=2 -p thread_pool_max=10000 -p thread_pool_timeout=300"

5、VCL 基础

(1)、VCL概念
  • Varnish Configuration Language (VCL) 是一种动态语言,用来描述请求处理和制定缓存策略。vcl配置内容由manager process 创建的VCC子进程转换成C语言代码,再经由gcc编译成共享对象,最后装载到cacher process中生效。
(2)VCL流程
  • 想要写好vcl配置,需要了解varnish内部报文的处理流程,其核心关键词是 finite state machine——有限状态引擎。下图为简单的处理流程:
varnish实现缓存对象及反代后端主机_第2张图片
image.png
  • 图中椭圆中代表状态引擎。这些状态引擎被概念化后成为vcl中的子函数,以vcl_前缀开头,在引擎中,可以对每个请求中的http 首部或者其他各方面的内容进行检查或者修改操作。return(action)代码表示中断一个状态,其中action是vcl关键字,用来指向下一步去向哪个状态引擎。

  • 每个请求都被单独分开处理;状态之间存在相关性,但彼此间互相隔离。

  • 在下一步了解vcl 配置代码之前,先了解一下vcl背后的基础概念。当varnish处理一个请求时,首先要解析这个请求。从http 首部中分析出请求的方法类型,判断是否为有效的请求方法等等,当基础解析完成之后,依据第一个策略进行检查进而做出判断。vcl就是根据由各个策略组成的规则来进行各种动作。

(3)VCL流程解释

上图可分为两个区域:前端frontend和后端backend

前端状态可分为四个阶段:
  • 第一阶段:

vcl_recv #接受客户端请求,进行判断

  • 第二阶段:

vcl_hash  #进行hash计算,不进行判读处理,计算之后送往各个第三阶段状态引擎中

  • 第三阶段:

vcl_hit #缓存命中,到此处理
vcl_pass #缓存跳过
vcl_miss #缓存未命中
vcl_purge  #清理缓存
vcl_pipe #对于无法识别的http首部请求直接送入管道,交由后端处理不再处理

  • 第四阶段:

vcl_deliver: 大部分响应客户端的请求由此发送回去

vcl_synth:接受来自vcl_purge的任务,对于指定的缓存,进行删除处理

后端状态分为两阶段:
  • 第一阶段:
    vcl_backend_fetch:接受来自前端状态vcl_pass或vcl_miss 的任务,向后端主机请求

  • 第二阶段:
    vcl_backend_response:接受到后端返回正常状态报文,进行是否缓存检查,需要缓存的响应将其缓存,不需要则不缓存,最后送到vcl_deliver

vcl_backend_error:后端主机错误,返回错误响应

除此之外还有两个特殊状态引擎:

vcl_init:在处理任何请求之前要执行的vcl代码:主要用于初始化VMODs;
vcl_fini:所有的请求都已经结束,在vcl配置被丢弃时调用;主要用于清理VMODs;

4、VCL语法

(1)语法特点
  • 一个大前提:varnish 4.0版本开始,vcl拥有自己的默认规则,它不可移除,总是追加在自定义的规则之后。
  • VCL称为”域“专有类型的配置语言;
  • VCL有多个状state engine态引擎,状态之间存在相关性,但状态引擎彼此间互相隔离;每个状态引擎可使用return(x)指明关联至哪个下一级引擎;每个状态引擎对应于vcl文件中的一个配置段,即为subroutine
    流程:vcl_hash --> return(hit) --> vcl_hit

vcl配置文件以 vcl 4.0 开头;
C语言注释风格://, # and /* foo */ ;
子函数使用sub关键字声明, 例如sub vcl_recv { ...};
无循环, state-limited variables(受限于引擎的内建变量);
使用return(action)中断引擎状态,指向下一步处理,action为关键字 ,例如: return(pass);
可动态装载;

(2) 三类主要语法:

sub subroutine {
...
}

if CONDITION {
...
} else {
...
}

return(), hash_data()

(3) 内建函数和关键字

函数:

hash_data():指明哈希计算的数据;减少差异,以提升命中率;
regsub(str,regex,sub):把str中被regex第一次匹配到字符串替换为sub;主要用于URL Rewrite
regsuball(str,regex,sub):把str中被regex每一次匹配到字符串均替换为sub;
return():
ban(expression)
ban_url(regex):Bans所有的其URL可以被此处的regex匹配到的缓存对象;
synth(status,"STRING"):purge操作;

关键字:
  call subroutine, return(action),new,set,unset

下图为指定函数智能用于特定子函数中

image

操作符:
  ==, !=, ~, >, >=, <, <=
  逻辑操作符:&&, ||, !
  变量赋值:=

正则匹配:~

(?i) 表示忽略大小写

  同时注意匹配的规则如果是字符串需要"  " 引起
(4) 变量类型:

内建变量:

第一类: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.*:存储在缓存空间中的缓存对象的属性;只读;

常用变量:

bereq.*, req.*:
bereq.http.HEADERS
bereq.request:请求方法;
bereq.url:请求的url;
bereq.proto:请求的协议版本;
bereq.backend:指明要调用的后端主机;

req.url:请求的url
req.http.Cookie:客户端的请求报文中Cookie首部的值; 
req.http.User-Agent:浏览器类型

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实现缓存对象及反代后端主机_第3张图片
image

用户自定义:
  set variable=value #定义变量
  unset variable #撤销定义的变量

二、varnish的基本安装配置和使用管理

1、varnish的基本安装

yum仓库为epel仓库
[root@varnish50 ~]# yum -y install vanish  

[root@varnish50 ~]# cd /etc/varnish
[root@varnish50 varnish]# vim varnish.params #编辑文件
# Varnish environment configuration description. This was derived from
# the old style sysconfig/defaults settings

# Set this to 1 to make systemd reload try to switch VCL without restart.
RELOAD_VCL=1 #会不会自动重新编译vcl配置文件,1代表编译

# Main configuration file. You probably want to change it.
VARNISH_VCL_CONF=/etc/varnish/default.vcl#启动时默认加载配置文件

# Default address and port to bind to. Blank address means all IPv4
# and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted
# quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=192.168.1.5#监听那个地址,不设置代表所有地址
VARNISH_LISTEN_PORT=80#端口

# Admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1#指定这个IP地址远程连接
VARNISH_ADMIN_LISTEN_PORT=6082

# Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret#使用秘钥文件认证连接

# Backend storage specification, see Storage Types in the varnishd(5)
# man page for details.
#VARNISH_STORAGE="malloc,256M"#使用内存缓存,指定大小
VARNISH_STORAGE="file,/data/varnish/cache,1g" #使用文件格式缓存、路径、大小
# User and group for the varnishd worker processes
VARNISH_USER=varnish
VARNISH_GROUP=varnish

# Other options, see the man page varnishd(1)
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"传递允许

[root@varnish50 varnish]# vim default.vcl#编辑默认配置文档
# Default backend definition. Set this to point to your content server.
backend default {
    .host = "192.168.1.12";#后端服务器地址
    .port = "80";
}
[root@varnish50 varnish]# mkdir -pv /data/varnish/cache
mkdir: 已创建目录 "/data/varnish"
mkdir: 已创建目录 "/data/varnish/cache"
[root@varnish50 varnish]# chown -R varnish:varnish /data/varnish/cache/#修改属主、组
[root@varnish50 varnish]# systemctl start varnish#启动varnish
[root@varnish50 varnish]# ss -tnlp #查看端口
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128             *:80                          *:*                   users:(("varnishd",pid=1728,fd=7))
root@varnish50 varnish]# varnish_reload_vcl#重载配置
varnish实现缓存对象及反代后端主机_第4张图片
测试访问后端主机

2、varnish的使用管理

1、使用格式

varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082

        help []#帮助命令
        ping []#探测
        auth #认证
        quit#退出
        banner#欢迎信息
        status#服务端进程状态
        start#开启服务端进程
        stop#停止服务端进程
        vcl.load  #装载那个vcl
        vcl.inline  
        vcl.use #切换那个vcl
        vcl.discard 
        vcl.list   #列出可用vcl
        param.show [-l] []查看内部线程
        param.set  修改内部参数
        panic.show
        panic.clear
        storage.list#列出存储
        vcl.show [-v] #查看vcl配置文件内容
        backend.list []#列出后端主机
        backend.set_health  #设置后端主机健康
        ban    [&&   ]...
        ban.list    
2、vcl配置文件相关:
            vcl.list 
            vcl.load:装载,加载并编译;
            vcl.use:激活;
            vcl.discard:删除;
            vcl.show [-v] :查看指定的配置文件的详细信息;
3、运行时参数:
            param.show -l:显示列表;
            param.show 
            param.set  
            
        缓存存储:
            storage.list
            
        后端服务器:
            backend.list 

三、反代后端主机实例

1、举例:obj.hits是内建变量,用于保存某缓存项的从缓存中命中的次数;

格式:
if (obj.hits>0) {
set resp.http.X-Cache = "HIT via " + server.ip;#发送到客户端首部自定义一个叫x-cache,这个首部的值是HIT via和变量server.ip拼接而成,注意变量不加引号
} else {
set resp.http.X-Cache = "MISS via " + server.ip;
}

[root@varnish50 ~]# vim /etc/varnish/default.vcl
......
sub vcl_deliver {
   if (obj.hits>0){
       set resp.http.X-Cache = "Hit via" + server.ip;
       } else {
       set resp.http.X-Cache = "Miss form" + server.ip;
      }
 # Happens when we have all the pieces we need, and are about to send the
[root@varnish50 ~]# 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.

vcl.load test1 default.vcl #载入默认配置
200        
VCL compiled.#编译成功

vcl.list#查询可用vcl
200        
active          0 boot
available       0 test1#可使用,未激活


vcl.use test1#使用test1
200        
VCL 'test1' now active

vcl.list#查询可用vcl
200        
available       0 boot
active          0 test1#已使用,处于活动状态

varnish实现缓存对象及反代后端主机_第5张图片
测试

2、示例:强制对某类资源的请求不检查缓存:

格式:
vcl_recv {
if (req.url ~ "(?i)^/(login|admin)") {#模式匹配,要不要字符区分大小写
return(pass);

            }
        }
[root@varnish50 ~]# vim /etc/varnish/default.vcl
......
sub vcl_recv {
    if (req.url ~ "(?i)^/(login|admin)") {
 #模式匹配,不区分字符大小写
      return(pass);
                                }
                        }

 # Happens before we check if we have this in cache already.

[root@varnish50 ~]# 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.

vcl.load test2 default.vcl#编译
200        
VCL compiled.
vcl.use test2  #使用test2
200        
VCL 'test2' now active
vcl.list  #查询
200        
available       0 boot
available       0 test1
active          0 test2#处于活动状态
varnish实现缓存对象及反代后端主机_第6张图片
测试

3、匹配请求包含curl,则返回405错误

[root@varnish50 ~]# vim /etc/varnish/default.vcl
......
sub vcl_recv {
     if (req.http.User-Agent ~ "(?i)curl"){#匹配请求包含curl,则返回405错误
            return(synth(405));
        }
.....
[root@varnish50 ~]# 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.

vcl.load test3 default.vc#编译l
200        
VCL compiled.
vcl.use test3#使用test3
200        
VCL 'test3' now active
vcl.list#查询
200        
available       0 boot
available       0 test1
available       0 test2
active          0 test3#处于活动状态
varnish实现缓存对象及反代后端主机_第7张图片
image.png

4、示例:对于特定类型的资源,例如公开的图片等,取消其私有标识,并强行设定其可以由varnish缓存的时长; 定义在vcl_backend_response中;

格式:

 if (beresp.http.cache-control !~ "s-maxage") {#如果后端服务器首部不能匹配s-maxage字符串
            if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$") {#如果后端服务器匹配jpg
                unset beresp.http.Set-Cookie;#删掉cookie
                set beresp.ttl = 3600s;#设置连接时间
            }
        }

定义在vcl_recv中;

            if (req.restarts == 0) { #做等值判断,防止请求重启
                if (req.http.X-Fowarded-For) {#如果对应变量有值,则它的值加上客户端ip
                    set req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip;
                } else {
                    set req.http.X-Forwarded-For = client.ip;#如果没有值,则只加ip
                }
            }

客户端测试查看日志:

[root@rs2 ~]# vim /etc/httpd/conf/httpd.conf    #设置后端服务器日志格式    
 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@rs2 ~]# systemctl restart httpd#重启服务
[root@rs2 ~]# tail -2 /var/log/httpd/access_log
192.168.1.102 - - [31/Jul/2018:01:03:00 +0800] "GET /admin/ HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36"#能够看到客户端ip和浏览器类型等信息

5、手动清理缓存中的指定的数据,修剪数据,purge方法

[root@varnish50 ~]# vim /etc/varnish/default.vcl
.......
sub vcl_recv {
     if (req.method == "PURGE"){#当收到请求方法为purge时然后转到purge
       return(purge);
}
#     if (req.http.User-Agent ~ "(?i)curl"){#这个注释掉
#            return(synth(405));
#        }
.....
[root@varnish50 ~]# 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.

vcl.load test6 default.vcl #编译
200        
VCL compiled.
vcl.use test6#使用
200        
VCL 'test6' now active
vcl.list#查询
200        
available       0 boot
available       0 test1
available       0 test2
available       0 test3
available       0 test4
active          0 test6  #处于活动状态

客户端测试:

[root@vs ~]# curl -X PURGE http://192.168.1.50/index.html#使用purge方法访问网址


  
    200 Purged   #方法
  
  
    

Error 200 Purged

Purged

Guru Meditation:

XID: 65575


Varnish cache server

[root@vs ~]# curl -I http://192.168.1.50/index.html#访问测试,如果能够匹配purged方法,则清理修剪缓存。 HTTP/1.1 200 OK Date: Tue, 31 Jul 2018 09:30:43 GMT Server: Apache/2.4.6 (CentOS) PHP/5.4.16 Last-Modified: Sun, 29 Jul 2018 16:13:53 GMT ETag: "19-57225a18e2b77" Content-Length: 25 Content-Type: text/html; charset=UTF-8 X-Varnish: 131076 Age: 0 Via: 1.1 varnish-v4 X-Cache: Miss form192.168.1.50#没有找到缓存 Connection: keep-alive
6、限定那些主机可以使用purge方法。
[root@varnish50 ~]# vim /etc/varnish/default.vcl
.......
vcl 4.0;
acl purgers {    #设定ip地址范围
     "127.0.0.1"/8;
      "192.168.1.0"/24;
}
.........
sub vcl_recv {
     if (req.method == "PURGE"){
     if (!client.ip ~ purgers){   #对客户端地址做匹配,如果不符合
         return (synth(405,"Purging not allowed for" + client.ip));#返回405合成一个错误响应报文
  }
       return(purge);
}
#     if (req.http.User-Agent ~ "(?i)curl"){
#            return(synth(405));
#        }
.....
[root@varnish50 ~]# 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.

vcl.load test7 default.vcl#编译
200        
VCL compiled.
vcl.use test7#使用
200        
VCL 'test7' now active
vcl.list#查询
200        
available       0 boot
available       0 test1
available       0 test2
available       0 test3
available       0 test4
available       0 test6
active          0 test7 #处于活动状态

客户端测试:

[root@vs ~]# curl -X PURGE http://172.16.1.50/index.html


  
    405 Purging not allowed for172.16.1.100
  
  
    

Error 405 Purging not allowed for172.16.1.100

#客户端ip不在响应范围内,访问purge请求返回错误

Purging not allowed for172.16.1.100

Guru Meditation:

XID: 131081


Varnish cache server

7、使用banning方法禁止或清理缓存

(1)、手动临时清理,执行一次生效一次。
[root@varnish50 ~]# varnishadm  -S /etc/varnish/secret -T 127.0.0.1:6082 
200        

ban req.url ~ ^/javascripts#用ban命令清理
200      
ban req.url ~.js$  #用ban命令清理以.js结尾的缓存
200
(2)、调用ban函数,执行清理
[root@varnish50 ~]# vim /etc/varnish/default.vcl
.......
sub vcl_recv {

if (req.method == "BAN") {
ban("req.http.host == " + req.http.host + " && req.url == " + req.url);#客户请求的主机名加请求资源
# Throw a synthetic page so the request won't go to the backend.
return(synth(200, "Ban added"));
                    }
[root@varnish50 ~]# 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.   
vcl.load test8 default.vcl
200        
VCL compiled.
vcl.use test8
200        
VCL 'test8' now active

客户端测试:

[root@vs ~]# curl -X BAN  http://192.168.1.50/javascripts/test.js#使用ban方法清除指定缓存


  
    200 Ban added
  
  
    

Error 200 Ban added

Ban added

Guru Meditation:

XID: 65580


Varnish cache server

[root@vs ~]# curl -I http://192.168.1.50/javascripts/test.js HTTP/1.1 503 Backend fetch failed Date: Tue, 31 Jul 2018 16:48:17 GMT Server: Varnish Content-Type: text/html; charset=utf-8 Retry-After: 5 X-Varnish: 65588 Age: 0 Via: 1.1 varnish-v4 X-Cache: Miss form192.168.1.50 #清理后显示miss Content-Length: 282 Connection: keep-alive

参考文献:https://www.cnblogs.com/cutemsyu/p/6051876.html

你可能感兴趣的:(varnish实现缓存对象及反代后端主机)