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中有张图,如下:
last-modified和expires定义可以看下图:(Chrome浏览器按下F12进入调试模式)
这里是一段响应报文首部(我们假设没有经过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