varnish缓存清理
本篇日志应该较早该去写的,一直脱了好久,直到最近才写。在使用任务cache工具时,都会提到的一个问题。如何只清理想清理的那部分缓存,而其已缓存的部分不受影响 。这里就要用到varnishadm工具,先看下其用法:
1[email protected]:[/root]/App/varnish/bin/varnishadm help
2help [command]
3ping [timestamp]
4auth response
5quit
6banner
7status
8start
9stop
10vcl.load <configname> <filename>
11vcl.inline <configname> <quoted_VCLstring>
12vcl.use <configname>
13vcl.discard <configname>
14vcl.list
15vcl.show <configname>
16param.show [-l] [<param>]
17param.set <param> <value>
18panic.show
19panic.clear
20storage.list
21backend.list
22backend.set_health matcher state
23ban.url <regexp>
24ban <field> <operator> <arg> [&& <field> <oper> <arg>]...
25ban.list
一、ban相关的用法
缓存清理部分主要使用的是ban命令,在一些老的varnish版本里是purge命令。varnishadm ban相关的处理命令非常强大,支持正则和不同的域名进行区分,还支持按文件大小进行处理。下面举一些例子:
1、最简单的用法ban.url
1[email protected]:[/root]/App/varnish/bin/varnishadm -T 127.0.0.1:2000 ban.url /download/
清理所有域名下download下的缓存。
2、匹配域名和url正则
1[email protected]:[/root]/App/varnish/bin/varnishadm -T 127.0.0.1:2000 ban req.http.host == "example.com" && req.url ~ ".png$"
以上是清理example.com域名下所有png文件的缓存。
3、根据大小进行处理
1varnishadm -T 127.0.0.1:2000 req.url !~ ".ogg$" && obj.size > 10MB
以上是清理所有大于10MB的ogg文件。
4、加cookile参数的清理
1req.http.host ~ "^(?i)(www.)example.com$" && obj.http.set-cookie ~ "USERID=1663"
这里是处理无论是 www.example.com 还是example.com下的cookile值USERID=1663的所有缓存 。具体的写法可以参看VCL语法,只要符合VCL语法的都可以通过ban使用。所有的正则含义如下:
A ban expression consists of one or more conditions. A condition consists of a field, an operator, and an argument. Conditions can be ANDed together with “&&”.
A field can be any of the variables from VCL, for instance req.url, req.http.host or obj.http.set-cookie.
Operators are “” for direct comparision, “~” for a regular expression match, and “>” or “<” for size comparisons. Prepending an operator with “!” negates the expression.
The argument could be a quoted string, a regexp, or an integer. Integers can have “KB”, “MB”, “GB” or “TB” appended for size related fields.
具体可以参看官网上的相关文档:
https://www.varnish-cache.org/docs/3.0/reference/varnish-cli.html
https://www.varnish-cache.org/docs/3.0/tutorial/purging.html
二、查看ban过的规则列表
可以使用ban.list查看已经ban过的规则列表:
1root@cache-40:[/root]/App/varnish/bin/varnishadm ban.list
2Present bans:
31384427961.641222 0 req.url ~ /download/
41384415727.496078 4G req.url ~ /download/
51384412783.261184 1 req.url ~ /android/
61384412640.295176 0G req.url ~ /download/
其中上面提到的G不是代表数据量大小的Gbit ,而是gone的意思,代表已经长时间无效或已经变成过去式的数据。被标记G代表是重复ban ,之所以标记是出于优化的目的。
三、强制无效
将req.hash_always_miss的值设为true ,将会将当前的缓存失效(但不会从历史中清除),而直接从后端拿新鲜的数据对象缓存,覆盖当前数据。而旧的缓存对象需要等到TTL过期或其他方法清除。
四、远程处理
varnishadm还可以通过telnet的方法处理,不过需要在vcl文件里事先指定允许的IP 。具体操作方法是“telnet varnish的IP varnishadm的端口”,如telnet 192.168.55.100 2000,进入使用的命令和以上说明一直,如:上面到的是varnishadm ban.list,在这里就直接输入ban.list就行了。另外需要注意的是在vcl规则中指定ban的IP时,重启加载配置原配置或重启varnish经常会报错,如下:
1acl purge {
2 "localhost";
3 "192.168.55.0"/24;
4}
增加后,再启动报错,varnish启动遇到的一个问题
1Message from VCC-compiler:
2Unused acl local, defined:
3('input' Line 12 Pos 5)
4acl local {
5----#####--
6Running VCC-compiler failed, exit 1
7VCL compilation failed
出现该错的原因是因为在sub vcl_recv 、sub vcl_hit、sub vcl_miss 缺少相关的配置。具体可以参考:
https://www.varnish-cache.org/docs/3.0/tutorial/purging.html#http-purges
按以上示例增加相关部分后,再加载配置文件就正常了。以上是基础,类似通过php或客户端等进行cache处理的都是在此基础上进行的增强,最终调用的一般还是varnishadm或telnet varnishadm的实现。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/varnish-purge/2340.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.