refresh_pattern指令在squid配置文件中定义,此参数控制着数据在磁盘上缓存的时间。

语法如下:

refresh_pattern [-i] regexp min percent max [options]

1,regexp:是匹配正则表达式,注意这里是区分大小写的,使用-i选项来定义它忽略大小写


2,min和max:单位是分钟,表示某个响应驻留在squid服务器的cache中的时间没有超过min限制,那么它不会过期,如果高于这个max限制,那么它必须被刷新。


3,percent:['Percent' is a percentage of the objects age (time since last modification age) an object without explicit expiry time will be considered fresh.]

要理解percent必须要了解LM-factor算法,在Squid.Definitive.Guide中有张图,如下:

squid中refresh_pattern参数 _参数

last-modified和expires定义可以看下图:(Chrome浏览器按下F12进入调试模式)

squid中refresh_pattern参数 _percent_02

这里是一段响应报文首部(我们假设没有经过web缓存服务器,直接由原始服务器返回的数据)

cache-control:HTTP1.1协议中定义,相对时长(相对于自身服务器时间而言)

expires:HTTP1.0中定义,1.1兼容,绝对时间

可以看到cache-control在某种程度上更加精准。

last-modified:表示在原服务器上最后一次页面修改的时间。

LM-factor算法定义:

date表示数据从原服务器进入squid缓存服务器的时间。这里可以看到由percent决定了expires的时间:

expires=date + [ date - (last-modified) ] * percent

所以满足下面两个条件之一,则cache数据过期,用户访问时必须被refresh。

1)缓存的数据在squid服务器中的时间超出refresh_pattern中定义的max值(相对时长)

2)缓存的数据在squid服务器中的时间超出expires的时间(绝对时间)


4,options中有些选项与http协议相违背:

override-expire:用户请求时,squid服务器不会先检查原始服务器响应报文首部expires,而是先检查min,若小于min值,squid会直接返回一个未确认的cache命中。

override-lastmod:该选项导致先检查min,再检查percent。若小于min值,squid会直接返回一个未确认的cache命中。

reload-into-ims:squid在转发请求之前,对该请求增加一个If-Modified-Since头部。

ignore-reload:squid服务器将忽略客户端请求时的no-cache指令。


案例:

refresh_pattern -i \.jpg$ 10080 50% 20160 override-expire ignore-reload reload-into-ims