文章地址:http://morganchengmo.spaces.live.com/blog/cns!9950CE918939932E!2132.entry
Config HTTP Header For Better Client Performance
网
站的性能(Performance)要考虑两方面,一方面是在Server端的运行效率,另一方面是在Client端感受到的效率。不要以为Server
端效率高这个网站或者服务给用户的体验就是高效的,如果不考虑影响Client
Performance的因素,Server端跑得再快用户也可能感觉慢得和牛一样。
Yahoo的哥们做的研究真不是盖的
,他们还写了本书《High Performance Web Sites》详细介绍如果提高Client Performance。公司内部也有一个Team做这方面的事情,听过他们的培训,和Yahoo说的差不多,所谓英雄所见略同。
给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control
Header是很有效的一招。如果HTTP
Response中有Expires这样的Header的话,浏览器会Cache这个资源,理想状况下(注意,只是理想状况),在Expire
Date之前,不会再发HTTP请求给Server要这个资源,不过Expires的值只能是一个固定日期,比如“Thu 27 Nov 2008
07:00:00
GMT”,不能是一个类似“从现在开始之后10年”这样一个随机浮动的值,如果要这样的效果,可以用Cache-Control这样的Header,如果
HTTP Resposne中有这样的Header:“Cache-Control: max-age =
100”,表示这个资源在cache中的最大寿命是100秒。一般说来这种静态文件永远不应该过期,如果真的要给这个Cache加上一个期限,那我希望是
——一万年,“Cache-Control: max-age = 315360000000”
其实就应该给Expires设一个永远不会过期的时间,比如你现在有一个文件叫logo.gif,需要用一个新的logo的时候,你不要去
覆盖原来的文件,而把新的logo存成logo_v2.gif,让相关网页引用新的logo_v2.gif,这样可以让新老网页同时工作,实在犯不上为了
节省存储空间覆盖原有文件。
对Apache服务器,使用mod_expires,在httpd.conf或者.htaccess中加上
<FilesMatch "\\.(ico|gif|jpg|html)$">
ExpiresDefault "access plus 10 years"
</FileMatch>
对于IIS 6(IIS 7还不清楚),通过IIS Manager可以通过GUI添加Expires/Cache-Control,通过命令行修改就麻烦一点了。
首先要到IIS的AdminScripts目录下去找到adsutil.vbs文件。
cd C:\Inetpub\AdminScripts
比如我们要给根目录下的imags目录添加Expires/Cache-Control,先要在metabase中给它加一个节点
cscript adsutil.vbs create W3SVC/1/root/images "IisWebVirtualDir"
如果希望访问images目录下的文件获得Cache-Control: max-age=60,就这样
csript adsutil.vbs set W3SVC/1/root/images/HttpExpires "D, 0x3c"
如果希望访问images目录下的文件获得“Expires: Thu 27 Nov 2008 07:00:00 GMT”,就这样
csript adsutil.vbs set W3SVC/1/root/images/HttpExpires "S, Thu 27 Nov 2008 07:00:00 GMT"
还有,同一个HTTP Response中可以同时有Expires和Cache-Control,但是Cache-Control权限比Expires大,会override它的。
HTTP的Response中还会有另外一个Header叫Last-Modified
,比如
“Last-Modified: Thu, 06 Apr 2006 21:17:12
GMT”,浏览器访问一个URI得到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个
Request给Server,不过这个Request中有一条“If-Unmodified-Since: Thu, 06 Apr 2006
21:17:12
GMT”,如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304
(Not Modified)
Response而不返回资源,告诉Client端:“这个资源从上次给你之来从来没改过,你放心用你Cache中的好了。” 一个304
Response比一个静态资源通常小多了,这样就节省了网络带宽。
让我们回过头来比较一下Expires和Last-Modified这两个东西,似乎Last-Modified比不上Expires,因
为虽然它能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而Expires却使得浏览器干脆连HTTP请求都不用发,岂不痛快!那还要
Last-Modified这个物体干什么?理想状况的确是这样,不过当用户在IE或者Firefox里面按F5或者点击Refresh按钮的时候(不是
在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是
要用的,而且要和Expires一起用。
除了Last-Modified
,HTTP Response中还可能有另外一个Header: ETag
,使得Server上的静态资源有点“版本控制”的味道
假如HTTP Response中包含“ETag:
"abcdefg1234:0001"”,等于告诉Client端,你拿到的这个版本的资源有个ID,叫做abcdefg1234:0001,下次需要发
Request索要同一个URI的时候,在Request里面加一条“If-None-Match:
"abcdefg1234:0001"”,好,Server端做了一些修改,下次这个Client再来了一个请求,但是这时候资源已经改了,所以返回这个
新资源,还有新的tag “ETag:
"abcdefg4567:0001"”(这个etag我是胡写的),这样,Client端等于Cache了两份,在需要索要这个资源的时候,可以包含这
样的Header: “If-None-Match: "abcdefg1234:0001"
"abcdefg4567:0001"”,这样,即使Server端头脑发热,把这个资源Roll back回原来的版本,依然会返回304 (Not
Modified)
Response,因为它知道Client端Cache着以前的版本呢,这点功能是Last-Modifed/If-Not-Modified没法做到
的。
不过ETag/If-None-Match这点功能实在是个鸡肋,首先,Server端的资源不大可能Roll
Back,更重要的是,有可能造成Client
Performance下降。对于只有一个Server的网站,没什么问题,但是现在稍微上点规模的网站都需要Scale
Out,也就是说需要前端一个Load
Balancer,后面接多台Server来处理请求,俗称Cluster,既然是Cluster,那么每个请求到底返回什么结果应该和分配到哪个
Server无关,不过这个ETag可能就坏事了。假如用户的第一次请求分配给Server A,返回“ETag:
"abcdefg1234:0001"”,但是第二次请求分配给了Server B,Server B上这个资源和Server
A上的一模一样,但是计算出这个资源的ETag是"abcdefg1234:0002",这下麻烦了,虽然内容一样,但是ETag不匹配,还是浪费了带宽
把资源发送了一遍,冤枉啊!而事实上,不同Server上的ETag很有可能不同,对于Apache,ETag的计算考虑了inode,对于
IIS,ETag考虑了metabase的修改版本,要保证不同server上的这些信息一致,有点小难。不过不是有Last-Modified/If-
Not-Modified吗?Server端看到If-Modified-Since,对照一下时间对得上,不管If-None-Match,可以直接发
回304(Not Modified)呀,很不幸,RFC2616对这种情况做了规定
,如果既有If-None-Match又有If-Modified-Since,除非两者不冲突,不然不会返回304。
所以说ETag就是一个害人精,按照Yahoo的建议,别费劲想办法同步不同Server上的ETag了,干脆就把ETag删除得了(缺
省,Apache和IIS都是有ETag的),我Sniff了一下Yahoo的若干网页返回HTTP Response,的确没有ETag,人家的确是知行合一
对于Apache,在httpd.conf或者.htaccess中加一行就搞定了:
FileETag none
对于IIS 6,可就有点费劲了,首先,似乎没有办法通过Config来把ETag去掉,查了很多资料,问了很多人,似乎能够去掉ETag的办法只有写一个ISAPI Filter来弄
,Sniff了一下Microsoft的几个网页的结果显示ETag都稳当当的存在,估计目前真的没有什么好方法。
只好退而取其次,保证不同Server上的ETag一致了。 IIS对Etag的计算算法是ETag =
{Filetimestamp:ChangeNumber},
Filetimestamp保持一致没什么问题,ChangeNumber是metabase的change
number,就有点难保证Cluster中每个Server都一样了,所以,干脆就把它设成固定值好了,这个连接
告诉我们该怎么办,很可惜,没有找到彻底删除ETags的配置。
分享到:
相关推荐
* 内存:用于存储备份和恢复过程中的数据缓存。 * 磁盘阵列:用于存储备份数据的存储设备。 * 网络接口:用于连接到客户端和其他设备的网络接口。 这些组件之间的交互关系非常重要,需要根据业务需求和数据量的增长...
This document provides different tools and techniques useful for debugging audio issues encountered in Linux-based systems. The document is mostly focused on the Android operating system, but some of ...
视频录制API unity 支持Android iOS windows平台下视频的录制 NatCorder is a lightweight, easy-to-use, full-feature video recording API for iOS, ... NatCorder is designed and heavily optimized for perfo
Veritas NetBackup Appliance Capacity Planning and Performance Tuning Guide 5.0 是一份详细的指南,旨在帮助用户有效地管理和优化Veritas NetBackup设备的容量与性能。这份文档是Veritas Technologies LLC的版权...
邮票v0.85 我们为您提供的计算机程序来创建邮票印章印!这个程序允许您快速,轻松地创建任何复杂的打印。要创建一个良好的打印不需要知道电脑程序易于使用,它可以造福大家!准备好打印布局可以使用打印机上的任何...
usinesses, whether small or large, use MySQL to access and manipulate their enterprise databases across the world. Advanced MySQL 8 will be your one-stop guide to implementing and managing large-...
Reflective fiber optic sensors have advantages for surface roughness measurements of some special workpieces, but their measuring precision and efficiency need to be improved further. A least-squares ...
更新 App.Config 以提供“ServiceBusConnectionString”和“StorageConnectionString”应用程序设置的值。 工作流程描述 此示例为公用事业公司的客户实施注册工作流程。 以下是工作流程的步骤: 工作流并行启动 3 ...
npmfix CLI工具,用于修复使用NPM管理依赖项的项目中的完整性检查问题。 查看有关此项目的我的。 要求 NPM Node.js 安装 通过运行以下命令来安装CLI: ... -s, --serious Serious fix mode: perfo
A retroreflector that reflects light along its incident direction has found numerous applications in photonics, but the ... The first metasurface serves as a transmissive achromatic lens that perfo
Fou r perfo rm2 ance indexes, body accelerat ion, p itch angle accelerat ion, su spen sion dynam ic t ravel and t ire dyn2 am ic def lect ion, w ere compared. The sim u lat ion resu lt s demon st ...
SQL查询分析器SQL查询分析器由用户分析给定的python文件,然后执行以下操作。 列出所有查询。... query_detector.py 在输入文件中检测SQL查询并将这些查询存储在另一个文件(即output.txt )中extract_perfo
项目管理实践模板及表格 项目管理实用工具及表格 规划.doc 监督和控制.doc 启动.doc 收尾.doc 执行.doc PMI网站:工具与模板 规划 ACTIVITY_ATTRIBUTES.docx ACTIVITY_COST_ESTIMATES.docx ...TEAM_MEMBER_PERFO
接下来,02_Computer Evolution and Perfo.ppt会涉及计算机的发展历程,从第一代电子管计算机到现代的微处理器。这里会讲述技术进步如何推动计算机性能的提升,如摩尔定律,以及如何通过优化设计提高能效。同时,这...
编号:118 摘 要 通用论坛BBS系统是按照MVC模式进行设计实现的,采用Tomcat作为后台服务器,以MySQL数据库作为数据服务器,使用Struts和Spring... The Struts and Spring realizes the logical control and the perfo
perfo/perfo.py包含用于运行和衡量排序算法的代码。 排序算法在simple/sort.py中定义。 您可以定义自己的并进行测试 使用蝗虫进行整合性能测试 就本演示而言,我们将测试在Docker映像中本地托管的简单REST API 先决...