squid缓存规则

squid控制缓存的主要是refresh-pattern参数,这个参数也是squid最复杂的一个参数,主要是缓存规则本身就复杂,要配置这个参数之前还需要了解一下HTTP缓存的机制。可以参考MDN上的HTTP缓存介绍。

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control

然后首先看看refresh-pattern的语法:

usage: refresh_pattern [-i] regex min percent max [options]

官方介绍在这里:

http://www.squid-cache.org/Doc/config/refresh_pattern/

但是只看官方文档很多,很多东西还是弄不明白的。

这个refresh pattern可以翻译为新鲜度模式,这个参数配置的也就是缓存对象的新鲜度(refreshness)

regex: 配置中regex是一个正则表达式,对整 个URL进行匹配,包括前面的http或https。如果是匹配所有的URL可以用一个“.”(英文句号)表示。

-i: 是一个可选参数,表示大小写不敏感

min: 单位是分钟数,表示只要min小于缓存的Age(Age是当前请求时间减去缓存上一次更新的时间)缓存就会命中。

max: 单位是分钟数,表示只要max大于缓存的Age(Age是当前请求时间减去缓存上一次更新的时间)缓存就过期,会重新请求原始文件刷新缓存。

percent: 单位是百分比,这个参数就是LM-Factor(LM系数),对于时间落在min和max之间的请求用percent进行计算是否会命中缓存,LM系数是用来计算max-age的,max-age=( Date – Last-Modified ) * percent,其中Date缓存时间Last-Modified是原始HTTP头中的值,percent就是LM系数。如果计算出来的max-age小于缓存Age(这里的Age应该是相对于Last-Modified的,而不是在Cache中的存活时间)则命中,否者过期。或者换一种说法,LM-factor=(response age)/(resource age),如果LM-Factor小于percent配置的值则缓存命中,否则过期。


这个图展示了LM系数的计算规则,squid缓存了一个3小时前的对象,LM系统配置为50%,则对象将在1.5小时后过期。

LM系数生效的前提是HTTP响应头中有Last-Modified。

如果以上3个规则都不匹配则缓存过期。

如果没有额外的参数仅就min,max,percent这三个参数,那么只会影响没有明确缓存过期时间的请求,对于已经指定了缓存规则的请求这里的规则是不生效的。下面的一些选项可以改变HTTP请求中自带的缓存规则。

override-expire

使用min参数覆盖HTTP请求中的过期时间(Expires以及Max-Age)

override-lastmod

忽略LM系数检查,只要大于缓存Age大于min值就过期。这个参数没看到详细解释,我是这样理解的。

reload-into-ims

为no-cache请求增加If-Modified-Since

经过我的测试,如果请求头中没有Last-Modified的话会把当前时间作为If-Modified-Since时间添加到请求头中,这个选项只是在原有no-cache请求中增加一个ims字段,http服务器遇到ims字段在资源没有变更的时候会直接返回304状态码。而且reload-into-ims修改过的请求都会访问原始服务器。

ignore-reload

忽略no-cache请求

ignore-no-store

忽略no-store请求

refresh-ims

ims请求始终访问原始服务器,默认在配置refresh-pattern的情况下ims请求不会发送给原始服务器。

store-stale

即使没有refresh或缓存控制也存储到缓存中,这意味着即使永远不会命中或已经过期的对象仍然存储在缓存中(这不是画蛇添足吗,除非中途修改了refresh模式,可以利用之前存储下来的缓存)。

max-stale=NN

单位是秒,用来覆盖全局max-stale

其它相关的配置

minimum_expiry_time

最小过期时间,剩余过期时间小于这个时间的的对象不做缓存,这个主要是担心请求的过程中对象就过期了,缓存就没有意义了还浪费存储空间。默认值是60秒。

max-stale

这个配置具体是怎么用的官网没有详细介绍,google也搜不出来任何资料,经过我反复测试,这个配置指的是原始服务器挂掉以后即使缓存过期squid仍然返回内容的时间限制。如果设置为0,缓存过期后立马返回504错误。

refresh_all_ims

所有ims请求都检查原始服务器,相当于refresh-ims的全局配置

reload_into_ims

与上面的reload-into-ims选项意思相同,但这个是全局配置

光refresh-pattern这个命令我研究了一天,发现除了min percent max这三个参数外,其它可选项原理复杂但并没啥太大用处,我本来想用来缓存git仓库的,测试来看squid并不能缓存git仓库中的数据。

发表回复