欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


Linux 中RPM命令参数使用详解
linux shutdown关闭系统命令使用介绍
电脑软件备份工具哪个好?
excel表格怎么根据身份证号码批量填写籍贯?
为什么阿里旺旺不能登录阿里巴巴中国版旺旺?
win10怎么锁屏?
linux解析命令行选项getopt_long用法解读
Linux tar 压缩档案管理命令学习
linux的重定向命令应用及语法
Linux下获取用户主目录的方法分享
squid 强制缓存动态页面
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

   其实我本不想写这个标题,我的本意是缓存yupoo api的查询数据,这个过程中找到了参考方法(Caching Google Earth with Squid)。呵呵,所以偶也来一回标题党。

  这篇参考流传非常广,Digg上也被提过,我也不知道原出处是哪里了。

  可是。。。。你按照它的指示设置,它并不能正确工作!!

  话说回来,先说说我的需求。

  最近yupoo的访问速度很慢,我有一堆api请求经常无法完成,猜测要么对方限制了同一ip的连接数,要么是yupoo又遇到了新一轮的流量瓶颈。跟Yupoo的zola联系后,确认是他们的负荷太高引起的,并没有限制连接数。所以我要想办法在我这边做一些缓存了。

  因为我这边本身就是用squid代理来解决Ajax中调用API的跨域问题的,所以自然是目标瞄准了squid的配置文件。

  yupoo api的请求地址是 www.yupoo.com/api/rest/?method=xx&xxxxxxx...

  大家都知道squid会自动缓存静态文件,可对于这种动态网页怎么让它也缓存起来呢,所以在google上找啊找,找到上面提得那片缓存Google Earth的博客文章。

  他的方法是:

  acl QUERY urlpath_regex cgi-bin ? intranet

  acl forcecache url_regex -i kh.google keyhole.com

  no_cache allow forcecache

  no_cache deny QUERY

  # ----

  refresh_pattern -i kh.google 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload

  refresh_pattern -i keyhole.com 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload

  原理就是用 no_cache allow 和 refresh_pattern 来设定一些缓存规则,将google earth的请求强行缓存起来。

  此文一出,自然早有人去验证,可是没人成功,原作者也音讯全无 ... squid的邮件列表里也提到。 ( 看标题进来的朋友,不要急,继续往下读,不会让你空手而回的 )

  我也没在意,估计人家功力问题 。先试着用改写一下解决yupoo api的缓存问题。

  acl QUERY urlpath_regex cgi-bin ?

  acl forcecache url_regex -i yupoo.com

  no_cache allow forcecache

  no_cache deny QUERY

  refresh_pattern -i yupoo.com 1440 50% 10080 override-expire override-lastmod reload-into-ims ignore-reload

  嘿,果然nnd毫无用处,访问记录里还是 一坨坨 TCP_MISS

  于是翻来覆去看文档,找资料,发现是squid的bug惹得祸,不过早已经修正(严格来说是功能扩展补丁)。

  我的squid是2.6.13,翻了一下源代码,确实已经打好补丁了。

  解决这个问题需要refresh_pattern的几个扩展参数(ignore-no-cache ignore-private),这几个参数在squid的文档和配置例子中均没有提到,看来squid还不够与时俱进。

  下面讲一下问题所在。

  先看看yupoo api返回的HTTP头部信息(cache 相关部分)

  Cache-Control: no-cache, must-revalidate

  Pragma: no-cache

  这两行是控制浏览器的缓存行为的,指示浏览器不得缓存。squid也是遵循RFC的,正常情况下自然不会去缓存这些页面。override-expire override-lastmod reload-into-ims ignore-reload 统统不能对付它。

  而那个补丁正是对付这两个Cache-Control:no-cache 和 Pragma: no-cache的。

  因此把 refresh_pattern那句要改写成

  refresh_pattern -i yupoo.com 1440 50% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private

  这样就大功告成了, squid -k reconfigure 看看 access.log ,这回里面终于出现

  TCP_HIT/200 TCP_MEM_HIT/200 了,说明缓存规则确实起作用了,那个激动啊 555~~~~

  ====================

  补充:

  后来我看了一下google earth 服务器 hk1.google.com的HTTP头部,只有

  Expires: Wed, 02 Jul 2008 20:56:20 GMT

  Last-Modified: Fri, 17 Dec 2004 04:58:08 GMT

  ,这么看来照理不需ignore-no-cache ignore-private也能工作,可能是作者这里写错了

  kh.google 应该是 kh..google才对。

  最后总结一下,缓存Google Earth/Map的正确的配置应该是

  acl QUERY urlpath_regex cgi-bin ? intranet

  acl forcecache url_regex -i kh..google mt..google mapgoogle.mapabc keyhole.com

  no_cache allow forcecache

  no_cache deny QUERY

  # ----

  refresh_pattern -i kh..google 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private

  refresh_pattern -i mt..google 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private

  refresh_pattern -i mapgoogle.mapabc 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private

  refresh_pattern -i keyhole.com 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private

  注:

  khX.google.com 是google earth的图片服务器

  mtX.google.com 是google map 的图片服务器

  mapgoogle.mapabc.com 是google ditu的图片服务器

  http://nukq.malmam.com/archives/16

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号
淳安分站 淳安分站