QuXiao's Blog

Life && Tech && Thoughts

Squid清除缓存注意事项

Written on

在CDN系统中,刷新CDN中的缓存是一个必备的功能,用户会经常用到(有时会滥用)。squid本身是支持清除缓存的,具体操作就是向squid服务端发送一个Method为PURGE的HTTP请求,十分简单。不过,看似简单的操作,其实还是有一些需要注意的地方。

清除缓存嘛,不就是执行以下命令嘛

curl -X PURGE -x 127.0.0.1:80 http://www.example.com/some_url

然后再测试一下请求资源是否MISS了

curl -svo /dev/null -x 127.0.0.1:80 -L "http://www.example.com/some_url"
* About to connect() to proxy 127.0.0.1 port 80 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET http://www.example.com/some_url HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.example.com
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK
< Server: openresty/1.7.7.2
< Date: Sun, 11 Oct 2015 12:59:28 GMT
< Content-Type: application/x-javascript; charset=GB2312
< Content-Length: 37860
< Connection: keep-alive
< Last-Modified: Fri, 09 Oct 2015 07:21:43 GMT
< Accept-Ranges: bytes
< X-Cache: MISS from www.some_cdn.com
<
{ [data not shown]
* Connection #0 to host 127.0.0.1 left intact

请求了一下,的确是MISS了,看起来生效了。

但是,其实这个是不对的,因为 只删除了未压缩版本的缓存,没有删除压缩版本的缓存 ,又由于浏览器的请求默认都是在Request Header中带上了 Accept-Encoding: gzip, deflate 或者 Accept-Encoding: gzip, deflate, sdch ,请求的是压缩版本的数据,所以之前的删除缓存操作是不充分的,还应该加上

curl -X PURGE -x 127.0.0.1:80 http://www.example.com/some_url -H 'Accept-Encoding:gzip,deflate,sdch'

(测试下来发现,是否加上sdch,效果是一样的)

这样才能把压缩版本的缓存删除掉。

我们从Squid的store.log中,也可以看出是否带了 Accept-Encoding Header的请求,对应的hash key也是不一样的。

curl -svo /dev/null -x 127.0.0.1:80 -H 'Accept-Encoding:gzip,deflate' http://www.example.com/some_url
1444571191.977 SWAPOUT 02 00000000 E402F2E9B05E6B502CD8BD3A9B46CC24  200 1444571192 1444375303        -1 application/x-javascript 37860/37860 GET http://www.example.com/some_url

curl -svo /dev/null -x 127.0.0.1:80 http://www.example.com/some_url
1444571201.012 SWAPOUT 03 00000000 C2A3BCE9067DBAA1AF38DB916B622AED  200 1444571201 1444375303        -1 application/x-javascript 37860/37860 GET http://www.example.com/some_url

hash key一个是E402F2E9B05E6B502CD8BD3A9B46CC24,一个是C2A3BCE9067DBAA1AF38DB916B622AED,两个是不一样的。

还有的 文章 说,和 Response Header 中的 Vary 值有关,具体还没深入研究,感兴趣的朋友可以看一看。

comments powered by Disqus