在aspx+squid平台上实现服务端+浏览器端cache
Aspx上面最简单的cache语句是:
<%@ OutputCache Duration="1000" VaryByHeader="*" VaryByParam="*"%>
VarybyHeader,是因为我们在一个iis站点里面host了很多的域名。VarybyParam,是因为aspx页面里面都是不同的参数。所以这两个参数必不可少。
这个只时候用户->IIS直接连接的方式,每次刷新页面,用户都需要从浏览器->iis获取一次数据。即页面如果是150k,那么每次都是获取150k大小的文件。
鉴于我们的北方网通用户,如果按照上面,用户每次刷新页面都需要从北方网通到南方电信获取150k页面。
于是,我们在北方做squid加速,进而改进squid语句。目前采用的语句是:
<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
%>
第一句是清理掉当前IIS端的Cache,其实际作用是防止由于域名,参数带来的串页。
第二句是设置cache可以作用在squid上。
第三句是设置页面的过期时间是10分钟以后。
这种情况下,用户每次刷新页面都是去缓存服务器上更新150k数据。减少了用户从北方网通到南方电信的访问,提高了用户速度。
上面的过期时间,流程如下:
1.IIS服务器现在时间:15:00,10分钟以后过期,即15:10过期。
2.这时,SQUID服务器时间,如果是15:15的话,那么内容是立即失效的,因为已经过了15:10了。所以SQUID服务器时间必须比IIS时间晚,当然也可以把10分钟时间改成30分钟等等。否则每次都是SQUID去IIS获取数据。
SQUID日志:
200 34410 TCP_MISS:DIRECT
3.上面的过期与客户端时间无关,即便客户端已经是2008年了。用户每次都是刷新一下150K内容。
SQUID日志:
200 34419 TCP_HIT:NONE
如果用户是按住ALT以后刷新,SQUID日志是:
200 34393 TCP_CLIENT_REFRESH_MISS:DIRECT
经过这两天测试,提出下面的改进:
<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>
第一句是清理掉当前IIS端的Cache,其实际作用是防止由于域名,参数带来的串页。
第二句是设置cache可以作用在squid上。
第三句是允许浏览器端可以缓存,其实第二句public就是已经包含这个,但是避免squid上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是10分钟以后。
第五句是设置页面的最大生存时间是300秒,就是5分钟。
第六句是设置页面的最后修改时间是5分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。
上面的过期时间,流程如下:
1.IIS服务器现在时间:15:00,10分钟以后过期,即15:10过期。
2.这时,SQUID服务器时间,如果是15:15的话,那么内容是立即失效的,因为已经过了15:10了。所以SQUID服务器时间必须比IIS时间晚,当然也可以把10分钟时间改成30分钟等等。
此时SQUID日志:
200 34442 TCP_REFRESH_MISS:DIRECT
3.客户端浏览器已经获得了最大生存时间是300秒,那么以客户端计算的300秒之内,他访问SQUID服务器的时候都是根据浏览器缓存,请求文件是不是已经修改。SQUID已经获取了最后修改时间,这样就能够返回HTTPcode302,即没有修改。
Resync URL Browser requested refresh if changed - http://zjvnet.9sky.com/index1.aspx Completed
HTTP Request Check if modified since 'Tue, 19 Apr 2005 07:58:40 GMT; length=34136' Completed
HTTP Response Only headers returned as content has not changed Completed
Read Cache Content read from browser cache Completed
此时SQUID日志:
304 225 TCP_IMS_HIT:NONE
这样的情况下,300秒之内每次传输的都是请求200个字节,返回300个字节。
当300秒以后,客户端请求到SQUID。如果SQUID还是没有到过期时间,那么依然返回的是304,即文件没有更改;如果SQUID到了过期时间,那么SQUID将向IIS请求文件是否变化,显然文件已经变化了,这个时候是SQUID向IIS获取文件,再向客户端返回HTTPcode200,
Resync URL Browser requested refresh if changed - http://zjvnet.9sky.com/index1.aspx Completed
HTTP Request Check if modified since 'Tue, 19 Apr 2005 08:08:42 GMT; length=34147' Completed
HTTP Response Headers and modified content returned Completed
此时SQUID日志:
200 34442 TCP_REFRESH_MISS:DIRECT
如果用户按住ALT,再刷新页面,这时日志是:
200 34457 TCP_CLIENT_REFRESH_MISS:DIRECT
在改进情况下,用户的速度再度提高。
除非用户每次都是按住CTRL,再刷新页面,但这只是在考验我们的传输线路。