Submitted by admin on 2012, October 22, 3:38 PM
Expires(过期时间)
Http 头信息设置过期时间,一般是设置一个时间点,例如:
Expires:Tue Jul 28 11:00:00 CST 2011 (2011/7/28)
一般使用在静态文件,例如img、js、css等。
要注意的:如果设置的过期时间是一个固定的时间,在返回内容的时候又没有连带更新下次过期的时间,那么之后都会请求服务器,反而增加了负载和响应时间。
Cache-Control(缓存控制)
缓存控制,使用起来更为灵活、功能更强大。
l max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。
l s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
l public — 标记认证内容也可以被缓存,一般来说:经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
l private — 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
l no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);
l no-store — 强制缓存在任何情况下都不要保留任何副本
l must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,你高速缓存,你希望严格的遵循你的规则。
l proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用
l min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
l max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
可以在ajax返回结果中加缓存,以及一些请求加缓存,这个需要程序实现。
Last-Modified
在第一次请求时服务器会返回一个200状态以及响应正文,同时在响应头中会有Last-Modified 信息,例如:Last-Modified: Mon, 25 Jul 2011 02:01:46 GMT
在第二次请求该URL时浏览器会在请求头信息中发送If-Modified-Since 信息,例如:
If-Modified-Since: Wed, 20 Jul 201106:31:59 GMT,如果服务器资源没有发生变化则返回304状态,如果有变化则返回响应正文。
Etag
Etag是配合If-None-Match来使用的,在服务器响应头信息中加入Etag,如:
Etag W/"1795-1310539468000",在请求头信息中加入If-None-Match发送etag信息到服务器,如:If-None-Match W/"1795-1310539468000",可以通过服务器配置来实现,也可以通过程序来实现。
对静态文件生成版本引用
封装成标签来统一生成html代码,基本思路是根据文件的名称(包括路径)当做key,文件的最后更新时间当做value存储在内存中,每次的html代码都从内存中获取版本信息来生成引用的html代码。
可以优化
1. 现有的static服务器缓存设置似乎有点问题,静态文件应该直接在客户端获取缓存,而不应该每次去服务器去校验返回304状态码。
HTTP/1.0304 Not Modified
Date:Sun, 24 Jul 2011 15:49:13 GMT
Content-Type:application/x-javascript; charset=utf-8
Expires: Sun, 24 Jul 2011 16:49:06 GMT
Last-Modified: Tue, 14 Dec 2010 03:22:35 GMT
Cache-Control:max-age=3600
X-Via:1.0 shnh222:8106 (Cdn Cache Server V2.0)
Age:142178
Warning:113 proxy1.staff.woyo.com (squid/3.1.9) This cache hit is still fresh and morethan 1 day old, 110 squid/3.1.9 "Response is stale", 111 squid/3.1.9"Revalidation failed"
X-Cache:HIT from proxy1.staff.woyo.com
Via: 1.0proxy1.staff.woyo.com (squid/3.1.9)
Connection: keep-alive
可以看出设置应该在2011年7月24 16:49:06 过期,也就是说现在访问该缓存已经过期!
为什么是304状态呢?
因为在响应头信息中Last-Modified: Tue, 14 Dec 2010 03:22:35 GMT,而在请求头信息中有:If-Modified-SinceTue,14 Dec 2010 03:22:35 GMT,也就说客户端实际去访问了服务器,服务器检测到该文件并没有修改过所以返回304状态码。
我们想要做到的是,一些js、css、img等静态文件信息直接在客户端缓存。
2. 在ajax以及页面的请求响应中加入Cache-Control 来控制缓存。
3. Etag可以使用在静态文件也可以用在页面请求,静态文件可以直接nginx中配置,页面请求的需要程序来完成。
Nginx配置 http://mikewest.org/2008/11/generating-etags-for-static-content-using-nginx
总结
1. Last-Modified, Etag条件缓存控制参数,需要和服务器请求查看资源是否改变,可以减少资源的下载量,但是不会减少请求数。
2. Expires,Cache-Control过期时间设置,同时设置时Cache-Control会覆盖Expires(只限于普通请求,如:链接点击跳转、用JS脚本打开新页面、使用iframe时),如果F5或者Ctrl+F5则忽略过期时间的设定。
3. 如果同时设置了过期时间和控制参数,在未过期时间内读取缓存不发起请求,过期后则发起请求,过期时间级别高于控制参数。
4. no-cache在IE中有效,no-store在firefox中有效,一般同时设置2个,如:
Cache-Control: no-cache, no-store。
附
表1 Cache-Control可设置值
值
说明
max-age=xxx
缓存的内容将在 xxx 秒后失效 , 这个选项只在 HTTP 1.1 可用 , 并如果和 Expires、Last-Modified 一起使用时 , 优先级较高
must-revalidation/
proxy-revalidation
如果缓存的内容失效,请求必须发送到服务器 / 代理以进行重新验证
no-store
所有内容都不会被缓存到缓存或 Internet 临时文件中
no-cache
所有内容都不会被缓存
private
内容只缓存到私有缓存中
public
所有内容都将被缓存
总结:
打开新窗口
如果指定 cache-control 的值为 private 、 no-cache 、 must-revalidate, 那么打开新窗口访问时都会重新访问服务器。而如果指定了 max-age 值 , 那么在此值内的时间里就不会重新访问服务器 , 例如: Cache-control: max-age=5 表示当访问此网页后的 5 秒内再次访问不会去服务器
在地址栏回车
如果值为 private 或 must-revalidate, 则只有第一次访问时会访问服务器 , 以后就不再访问。如果值为 no-cache, 那么每次都会访问。如果值为 max-age, 则在过期之前不会重复访问。
按后退按扭
如果值为 private 、 must-revalidate 、 max-age, 则不会重访问 , 而如果为 no-cache, 则每次都重复访问
按刷新按扭
无论为何值 , 都会重复访问
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:981
Submitted by admin on 2012, September 2, 10:40 PM
TCP_NEGATIVE_HIT
在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否
命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下
列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501,
502, 503, 504。
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:912
Submitted by admin on 2012, August 9, 11:13 AM
cache_dir scheme directory size L1 L2 [options]
这个选项可以说是squid.conf中最重要的参数设定之一了。所以必须要吃透它!
Scheme:
可以从编译参数—enable-storeio=LIST 中指定,默认为ufs。其他有:aufs, diskd, coss, null
Directory:
存储缓存对象的目录,建议将一个缓寸目录放在单独的分区中,另外最好放在一个单独的物理磁盘来使用。
Size:
没有上限,一般建议是整个分区的90%以下,因为还有10%要给swap.state和一些临时文件使用。
下限可以自己测试,先设一个比较小的值,比如100M,并且设置可以用满,等待一周,如果分区满了,那么你就要适当的调大。
Inodes也是一个相当重要的标准,如果inode用完的话,就算磁盘空间还有很多空余也是浪费。
可以通过df -ik来察看,另外一些创建文件系统的命令(newfs,mkfs)也有相应的参数,一般是-i。
磁盘空间和进程大小之间的关系:
每一个在磁盘上的缓存对象都会占有一小块内存。Squid用这些内存来建立磁盘上的缓存数据的索引,以便快速找到。如果要增加一个新的cache目录或者增加磁盘空间的大小,先要确认有足够的内存。如果Squid进程占有的太大导致内存不够,Squid的性能会降低的非常明显。
每个在缓存目录中的对象都将会根据系统的不同而占有76或者112个字节。其中在32位的Inter架构上的占有76个字节。可以通过cache manager察看多少内存被使用了。
L1 and L2:
Squid会建立2级目录树在缓存目录。L1指定第一层,L2指定第二层各是多少目录数。默认为16和256。真正的缓存目录放在二级目录下,并且数据存放是按次序的,Squid有一套算法storeUfsDirFullPath( )实现一组页面的数据存储在相同的二级目录中。而且从实际情况来看,数据都是按顺序一个目录一个目录存放下去的。
Options: (read-only max-size)
read-only:用在当你将缓存目录下面的内容移动到其他硬盘上,并且还需要这些数据的时候。如果不加read-only,Squid的hit率会急剧下降。等运行一段时间后再去掉这个选项即可。
max-size:指定最大缓存的数据大小。单位是字节。
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:829
Submitted by admin on 2012, July 3, 9:24 AM
range_offset_limit这个参数,主要是对各种流媒体和要断点续传的文件的缓存的.缺省是0,也就是说只要client发过来的http header里包含了“Range:” ,squid会把这个请求转到后端http server,最致命的是,http server返回的内容并不会进入squid的cache store.
range_offset_limit就派上用场了,把它的值设置为-1;然后squid会把Range头去掉,而从后端http server把内容全部抓下来,放到cache store里,随后的对该cache的访问就不再转发到后端http server,可以大大提高命中率.也可以给这个参数设置一个值,会提前下载多少内容.但要注意,这个参数不要大过maximum_object_size ,不然下载完了,maximum_object_size 这个参数不能缓存这么多,又删除这个文件.白白点用你的流量.
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:1162
Submitted by admin on 2012, June 27, 3:18 PM
- cache_effective_user squid #运行squid的用户
- cache_effective_group squid #运行squid的用户所在的组
- visible_hostname squid1.cache.cn #设定squid的主机名,如无此项squid将无法启动
- http_port 80 accel vhost vport #代理端口
- icp_port 3130 #icp端口
- # 配置其他缓存服务器,当squid1在其缓存中没有找到请求的资源时,通过ICP查询去其邻居中取得缓存
- cache_peer 192.168.0.150 sibling 80 3130
- # 后端web服务器配置,round-robin表示通过轮询方式将请求分发到其中一台web节点
- cache_peer 192.168.0.108 parent 80 0 no-query originserver round-robin name=webServer1
- cache_peer 192.168.0.109 parent 80 0 no-query originserver round-robin name=webServer2
- cache_peer 192.168.1.115 parent 80 0 no-query originserver round-robin name=webServer3
- cache_peer_domain webServer1 webServer2 webServer3 .xuad.com #根据通配域名xuad.com来进行转发
- # 下面三行是配置访问控制的
- acl localnet src 192.168.0.149 192.168.0.150 #配置同级代理服务器IP段
- http_access allow all #允许以上所有规则通过
- icp_access allow localnet #允许localnet规则通过
- # URL中包含cgi-bin和以https:\\开头的都不缓存,asp、cgi、php、jsp等动态页面也不缓存
- hierarchy_stoplist cgi-bin ?
- hierarchy_stoplist -i ^https:\\ ?
- acl QueryString urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi
- acl denyssl urlpath_regex -i ^https:\\
- no_cache deny QueryString
- no_cache deny denyssl
- # 日志和缓存目录的设置
- cache_log /usr/local/squid/var/logs/cache.log #cache.log日志文件存放目录
- access_log /usr/local/squid/var/logs/access.log squid #access.log日志文件存放目录
- cache_dir aufs /var/cache 1024 16 256 #设定缓存目录cache,目录容量最大1024M,16*256级子目录
- cache_dir aufs /var/squid 3072 16 256 #设定缓存目录squid,目录容量最大3072M,16*256级子目录
- cache_mem 128 MB #squid用于缓存的内存容量
- # 当缓存目录空间使用达到95%以上时,新的内容将取代旧的内容,直到空间又下降到90%才停止这一活动
- cache_swap_low 90
- cache_swap_high 95
- # 设置存储策略
- maximum_object_size 4096 KB #能缓存的最大对象为4M
- maximum_object_size_in_memory 80 KB #内存中缓存的最大对象80K
- ipcache_size 1024 #缓存DNS解析得到的IP,最大单个对象为1024K
- ipcache_low 90
- ipcache_high 95
- cache_replacement_policy lru #缓存替换策略
- memory_replacement_policy lru #内存替换策略
- memory_pools on #开启内存池
- memory_pools_limit 32 MB #限制内存池大小为32MB
-
- forwarded_for on #开启转发
- log_icp_queries off #关闭icp查询日志
-
- forward_timeout 20 seconds #允许转发超时20秒
- connect_timeout 30 seconds #连接到其他机器的最大尝试时间
- read_timeout 3 minutes #允许读取超时3分钟
- request_timeout 1 minutes #允许返回超时1分钟
- persistent_request_timeout 30 seconds #允许持续连接超时30秒
- client_lifetime 15 minutes #客户端会话保持
- shutdown_lifetime 5 seconds
- negative_ttl 30 seconds #设置错误信息的生存时间
- # 允许一个IP最大并发数为50
- acl OverConnLimit maxconn 50
- http_access deny OverConnLimit
-
- client_persistent_connections off #对客户端长连接KeepAlive这个参数的支持
- server_persistent_connections on # 开启服务端的KeepAlive,web端要开启KeepAlive,不然这里打开是没用的
- tcp_recv_bufsize 65535 bytes #TCP套接字接收缓冲区大小
- half_closed_clients off #当客户与squid的连接处于半关闭状态时,允许squid立即关闭连接
-
- via on #开启转发循环的检测
- request_header_access via deny all #避免由于两台squid的主机名一样而返回403错误
- httpd_suppress_version_string off #错误页面不显示squid的版本信息
- ie_refresh off #是否允许对旧版本的IE浏览器强制刷新页面
注:shutdown_lifetime 5 seconds说明:当收到SIGTERM 或者 SIGHUP 信号后,squid将进入一种shutdown pending的模式,等待所有活动的套接字关闭。在过了shutdown_lifetime所定义的时间后,所有活动的用户都将收到一个超时信息。缺省值为30秒。
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:817
Submitted by admin on 2012, June 1, 10:39 AM
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:856
Submitted by admin on 2012, May 22, 3:08 PM
用Squid缓存Google Earth/Map数据2007/7/4 at 04:21 · Server
其实我本不想写这个标题,我的本意是缓存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
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:777
Submitted by admin on 2012, May 10, 4:38 PM
CPU占用率高可能有多个起因。用htop或atop观察能看到是应用程序占用了CPU时间还是内核本身占用了很多CPU时间,对网卡驱动不太好的系统来说可能 处理网卡的IRQ中断会占用大量时间,可能会达到50%以上。所以我原来用的开源的e1000e驱动换成Intel官方的驱动后性能好了很多。
如果系统开始使用SWAP,它的性能就会急剧下降,建议关掉swap(或只留几十MB的交换空间,然后sysctl -w vm.swappiness=1)。
如果怀疑是IO问题,试试 cache_dir null /tmp
squid是单进程,不支持SMP确实是问题,可以尝试下这个:
http://eu.squid-cache.org/ConfigExamples/ExtremeCarpFrontend
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:819