关于squid请求源服务器的响应中带Vary头
1. 源服务器返回的响应头不带”Vary: Accept-Encoding”
不管客户端请求头中带不带”Accept-Encoding: gzip,deflate”,squid会只缓存一份对象
1)如果第一个MISS的请求,客户端请求头中带”Accept-Encoding: gzip,deflate”。
源服务器会返回带gzip压缩的对象给squid,squid会把这个gzip压缩之后的对象保存下来。
以后不管客户端的请求头中是否带”Accept-Encoding: gzip,deflate”,都会把这个gzip的对象返回给client。
2)如果第一个MISS的请求,客户端请求头中不带”Accept-Encoding: gzip,deflate”。
源服务器会返回不压缩的对象给squid,squid会把这个没经过压缩的对象保存下来。
以后不管客户端的请求头中是否带”Accept-Encoding: gzip,deflate”,都会把这个没压缩的对象返回给client。
2. 源服务器返回的响应头中带”Vary: Accept-Encoding”
squid会根据客户端每次不同的请求头中”Accept-Encoding”包含的值,squid会缓存多份对象,可能每份对象都相同。
1)客户端请求头中不带”Accept-Encoding”。squid先判断是否存在以url为key的StoreENtry。
2)如果不存在,squid请求原服务器,源服务器会返回一个不带压缩的对象给squid,squid会把这个没经过压缩之后的对象保存下来。
存放的时候squid先创建一个StoreEntry(VaryData)对象,对象的http响应头是squid内部对象头,对象body部分保存这个url包含不同的
accept-encoding值和这个值对应的StoreEntry的KEY。
00002472 48 54 54 50 2f 31 2e 30 20 32 30 30 20 49 6e 74 |HTTP/1.0 200 Int|
00002482 65 72 6e 61 6c 20 6d 61 72 6b 65 72 20 6f 62 6a |ernal marker obj|
00002492 65 63 74 0d 0a 53 65 72 76 65 72 3a 20 73 71 75 |ect..Server: squ|
000024a2 69 64 0d 0a 44 61 74 65 3a 20 4d 6f 6e 2c 20 31 |id..Date: Mon, 1|
000024b2 34 20 4e 6f 76 20 32 30 31 31 20 30 38 3a 35 30 |4 Nov 2011 08:50|
000024c2 3a 30 39 20 47 4d 54 0d 0a 43 6f 6e 74 65 6e 74 |:09 GMT..Content|
000024d2 2d 54 79 70 65 3a 20 78 2d 73 71 75 69 64 2d 69 |-Type: x-squid-i|
000024e2 6e 74 65 72 6e 61 6c 2f 76 61 72 79 0d 0a 45 78 |nternal/vary..Ex|
000024f2 70 69 72 65 73 3a 20 54 75 65 2c 20 31 35 20 4e |pires: Tue, 15 N|
00002502 6f 76 20 32 30 31 31 20 31 32 3a 33 36 3a 34 39 |ov 2011 12:36:49|
00002512 20 47 4d 54 0d 0a 56 61 72 79 3a 20 41 63 63 65 | GMT..Vary: Acce|
00002522 70 74 2d 45 6e 63 6f 64 69 6e 67 0d 0a 0d 0a 4b |pt-Encoding….K|
00002532 65 79 3a 20 44 39 37 31 34 31 44 30 31 39 39 45 |ey: D97141D0199E|
00002542 45 36 31 31 0a 56 61 72 79 44 61 74 61 3a 20 61 |E611.VaryData: a|
00002552 63 63 65 70 74 2d 65 6e 63 6f 64 69 6e 67 3d 22 |ccept-encoding=”|
00002562 67 7a 69 70 2c 64 65 66 6c 61 74 65 22 0a 4b 65 |gzip,deflate”.Ke|
00002572 79 3a 20 31 42 31 43 32 31 34 34 44 38 38 30 36 |y: 1B1C2144D8806|
00002582 46 35 32 0a 56 61 72 79 44 61 74 61 3a 20 61 63 |F52.VaryData: ac|
00002592 63 65 70 74 2d 65 6e 63 6f 64 69 6e 67 3d 22 67 |cept-encoding=”g|
000025a2 7a 69 70 2c 64 65 66 6c 61 74 65 2c 73 64 63 68 |zip,deflate,sdch|
000025b2 22 0a 4b 65 79 3a 20 32 39 38 37 36 32 46 45 30 |”.Key: 298762FE0|
000025c2 37 46 33 30 42 35 39 0a 56 61 72 79 44 61 74 61 |7F30B59.VaryData|
000025d2 3a 20 61 63 63 65 70 74 2d 65 6e 63 6f 64 69 6e |: accept-encodin|
000025e2 67 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |g……………|
把这个创建好的StoreEntry(VaryData)内部对象保存到磁盘之后,squid再把从源服务器取回来的对象数据保存到根据url和”accept-encoding=value”产生的hash_key对象中。
3)假设请求头中包含”Accept-Encoding: gzip,deflate”,如果squid查找url对应的StoreEntry(VaryData)对象的数据存在。
squid读取磁盘中的StoreEntry对象,判断是VaryData对象,解析VaryData对象中包含的”accept-encoding=value”和对应的Key。
a)如果请求有匹配的”Accept-Encoding: gzip,deflate”,读取”Accept-Encoding: gzip,deflate”对应的Key的StoreEntry数据返回给客户端。
按照上面给出的Accept-Encoding: gzip,deflate对应的Key:298762FE07F30B59,那么返回hash_key: 298762FE07F30B59对应的StoreEnty。
b)如果没有匹配的”Accept-Encoding: gzip,deflate”,squid去源服务器取数据(”Accept-Encoding: gzip,deflate”请求头),
创建StoreEntry,把”Accept-Encoding: gzip,deflate”和key对应的值添加到VaryData中,写新的VaryData到新的文件里面,删除原来的文件。
把从源服务器取来的数据写到新的StoreEntry中。
建议继续学习:
- 使用Squid缓存视频 (阅读:9186)
- 系统架构的一些思考 (阅读:5626)
- [调优] Squid 不同版本的性能对比 (阅读:4223)
- [squid] 过期时间在 60 秒内 squid 不 Cache 的问题 (阅读:3986)
- Squid 限制用户并发连接数 (阅读:3961)
- [Squid] TCP_MEM_HIT 和 TCP_HIT 的性能到底相差多远 (阅读:3658)
- squid缓存失效之谜:一步步提高squid缓存命中率办法记录 (阅读:3529)
- 加速WEB访问:使用DNSmasq与squid代理并过滤广告 (阅读:3351)
- squid对源网站进行限速 (阅读:3158)
- Squid 透明代理优化 (阅读:2710)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:士豪 来源: 淘宝核心系统团队博客
- 标签: squid Vary
- 发布时间:2012-09-18 23:42:04
- [46] 界面设计速成
- [41] Oracle MTS模式下 进程地址与会话信
- [40] 视觉调整-设计师 vs. 逻辑
- [39] IOS安全–浅谈关于IOS加固的几种方法
- [38] android 开发入门
- [37] 如何拿下简短的域名
- [36] 程序员技术练级攻略
- [35] 图书馆的世界纪录
- [35] 【社会化设计】自我(self)部分――欢迎区
- [33] 读书笔记-壹百度:百度十年千倍的29条法则