`
liyao20050101
  • 浏览: 14547 次
  • 性别: Icon_minigender_1
  • 来自: bj & 江西萍乡
最近访客 更多访客>>
社区版块
存档分类
最新评论

Config HTTP Header For Better Client Performance

阅读更多

网站的性能(Performance)要考虑两方面,一方面是在Server端的运行效率,另一方面是在Client端感受到的效率。不要以为Server端效率高这个网站或者服务给用户的体验就是高效的,如果不考虑影响Client Performance的因素,Server端跑得再快用户也可能感觉慢得和牛一样。

Yahoo的哥们做的研究真不是盖的,他们还写了本书《High Performance Web Sites》(转者注:建议前端开发者看下这本书,本人前段时间优化公司网站 http://jipiao.wendoo.com 时,根据其中的几条原则进行优化,效果明显,当然对一些关键技术的掌握是非常重要,比如该站 的 js。 )详细介绍如果提高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”Smile

其实就应该给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比一个静态资源通常小多了,这样就节省了网络带宽。

图像099

让我们回过头来比较一下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上的静态资源有点“版本控制”的味道Smile 假如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。

图像101

所以说ETag就是一个害人精,按照Yahoo的建议,别费劲想办法同步不同Server上的ETag了,干脆就把ETag删除得了(缺省,Apache和IIS都是有ETag的),我Sniff了一下Yahoo的若干网页返回HTTP Response,的确没有ETag,人家的确是知行合一Smile 

对于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的配置。

转载:http://morganchengmo.spaces.live.com/blog/cns!9950CE918939932E!2132.entry 

分享到:
评论

相关推荐

    php.ini-development

    On production servers, 4096 bytes is a good setting for performance ; reasons. ; Note: Output buffering can also be controlled via Output Buffering Control ; functions. ; Possible Values: ; On = ...

    python3.6.5参考手册 chm

    PEP 471 - os.scandir() function – a better and faster directory iterator PEP 475: Retry system calls failing with EINTR PEP 479: Change StopIteration handling inside generators PEP 485: A function...

    Bochs - The cross platform IA-32 (x86) emulator

    - Update config.guess/config.sub scripts to May 2010 revisions. - Update Visual Studio 2008 project files in build/win32/vs2008ex-workspace.zip - Added Bochs compilation timestamp after Bochs ...

    在WPF中使用ItemsControl控件来实现线状图控件

    在WPF中使用ItemsControl控件来实现线状图控件

    语音合成_变分自编码器_对抗学习_端到端文本转语音技术_研究_1744171913.zip

    语音合成_变分自编码器_对抗学习_端到端文本转语音技术_研究_1744171913.zip

    基于ThinkPHP5.1的高效多商户在线客服系统架构与优化

    内容概要:本文详细介绍了基于ThinkPHP5.1框架构建的多商户在线客服系统的源码和技术实现细节。系统采用动态域名绑定实现商户隔离,数据库分表确保数据安全,机器人聊天模块使用三级匹配策略提高应答效率,地图统计功能利用IP库和ECharts展示客户分布情况,服务器优化方面通过缓存策略和流量控制提升性能。此外,还包括了自适应布局、离线消息机制以及APP封装等内容。 适合人群:有Web开发经验的技术人员,尤其是对ThinkPHP框架有一定了解的开发者。 使用场景及目标:适用于需要搭建高性能、低成本多商户在线客服系统的公司或个人。主要目标是帮助开发者理解和掌握如何通过合理的架构设计和技术手段,在有限的硬件条件下实现高效的客户服务。 其他说明:文中提供了大量实际代码片段作为参考,有助于读者更好地理解具体实现方法。同时强调了性能优化的重要性,如缓存使用、数据库设计等方面的经验分享。

    三菱PLC FX3U与松下伺服四轴控制系统的功能块设计及应用

    内容概要:本文详细介绍了三菱PLC FX3U与松下伺服组成的四轴控制系统的设计与实现。硬件部分由FX3U-48MT本体和两个1PG定位模块构成,每个1PG模块连接两个松下A5伺服,形成四轴系统。软件部分通过功能块(FB)进行模块化设计,涵盖JOG控制、回零、定位等功能。每个功能块内部实现了复杂的控制逻辑,如加减速曲线、方向控制等,并通过ST语言编写。此外,MCGS触摸屏用于参数配置和监控,支持CSV文件保存配方,通过MODBUS RTU协议与PLC通信。电气图纸和IO表详细记录了各信号的连接和功能,便于现场施工和维护。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是熟悉三菱PLC和松下伺服系统的用户。 使用场景及目标:适用于需要实现多轴精密控制的工业应用场景,如数控机床、自动化生产线等。目标是提供一种高效、易维护的多轴控制系统解决方案。 其他说明:文中提供了详细的代码示例和硬件配置说明,有助于理解和实施该项目。同时,强调了良好的注释习惯和模块化设计思想,提高了系统的可移植性和可维护性。

    试题:线性空间的维数与子空间.docx

    试题:线性空间的维数与子空间.docx

    浅析融合城乡信息化建设-推进城乡统筹发展.docx

    浅析融合城乡信息化建设-推进城乡统筹发展.docx

    基于蒙特卡洛法的电动汽车充电负荷预测:出行时间、行驶里程与充电时间的概率模型 Python 实现

    内容概要:本文详细介绍了如何利用蒙特卡洛方法进行电动汽车充电负荷预测。首先,针对不同类型的电动汽车(如私家车、出租车、物流车)建立了各自的出行时间、行驶里程和充电时间的概率模型。通过Python代码实现了这些模型的具体构建,包括使用正态分布、威布尔分布、泊松分布等生成样本数据。接着,通过蒙特卡洛抽样方法模拟大量车辆的充电行为,并将这些数据汇总到24小时的时间段内,形成总的充电负荷曲线。此外,文中还讨论了如何处理跨天充电、不同充电功率以及温度对电池效率的影响等问题。最后,通过可视化展示了充电负荷的峰谷特征,并探讨了模型的扩展性和灵活性。 适合人群:对电力系统规划、智能交通系统感兴趣的科研人员和技术开发者,尤其是有一定Python编程基础的人群。 使用场景及目标:适用于研究电动汽车充电负荷对电网的影响,帮助电网运营商制定合理的调度计划,评估不同政策对充电负荷的影响,以及优化充电基础设施布局。 其他说明:本文提供了详细的代码示例,便于读者理解和复现实验结果。同时强调了蒙特卡洛方法在处理不确定性和随机性方面的优势,为未来的研究提供了有价值的参考。

    【计算机科学】C++实现弹簧-质点系统物理仿真:基础物理计算与可视化输出设计

    内容概要:本文档展示了一个基于C++的弹簧-质点系统仿真实例,详细介绍了系统的各个组成部分及其工作原理。首先定义了用于处理二维向量运算的`Vec2`类,然后创建了表示质点的`MassPoint`类,包括位置、速度、受力等属性。接着是`Spring`类,它模拟了连接两个质点的弹簧,并应用胡克定律和阻尼力来计算弹簧力。最后是`PhysicsSimulator`类,负责管理整个仿真过程,包括初始化质点和弹簧,在每个时间步长中重置所有力、应用重力、计算弹簧力并通过积分更新位置和速度。此外,还提供了简单的可视化输出。; 适合人群:对物理仿真感兴趣,有一定C++编程基础的学习者和开发者。; 使用场景及目标:①理解物理仿真中质点-弹簧系统的构建方法;②掌握如何用C++实现基本的物理计算,如力的合成与分解、欧拉积分法等;③学习如何将物理公式转化为程序代码。; 阅读建议:本实例

    jw.js压缩包.zip

    jw.js压缩包.zip

    用信息化的手段固化管理流程范本.docx

    用信息化的手段固化管理流程范本.docx

    微信群永久二维码生成系统

    微信群永久二维码生成系统

    试题:向量的内积与正交性.docx

    试题:向量的内积与正交性.docx

    3dmax插件022-一键渲染.ms

    3dmax插件

    运动控制领域雷赛、正运动与固高原码的互通实现及应用

    内容概要:本文探讨了在运动控制领域中,雷赛、正运动和固高原码之间的互通性和实现方法。首先解释了为什么需要进行源码交换,即为了利用不同品牌的优势并节省开发时间和成本。接着详细介绍了交换的基本思路和技术可行性,强调了尽管不同品牌的运动控制逻辑有所区别,但在基本原理上是相通的。然后具体阐述了实现源码交换的三个主要步骤:接口标准化、底层适配层开发以及整合与测试。同时指出了在这个过程中可能遇到的问题及其解决方案,如指令集差异和硬件差异等。最后分享了一些实践经验,包括如何处理异常状态、运动参数配置的不同之处以及状态监控的实现差异。 适合人群:从事工业自动化或运动控制系统开发的专业人士,尤其是那些希望提高跨品牌兼容性的工程师。 使用场景及目标:适用于需要在同一项目中集成多种品牌运动控制器的应用场合,旨在帮助开发者更好地理解和实施不同品牌间的源码互换,从而优化系统的灵活性和效率。 其他说明:文中还提到了一些具体的编程细节和技术要点,如C++模板函数用于自动选择正确接口、JSON配置文件的品牌标识字段解析、状态转换中间件的设计等。此外,作者也分享了许多宝贵的实战经验,提醒读者注意诸如齿轮比处理、状态码对照表准备等方面的实际问题。

    面向对象编程(OOP)·笔记(附件)

    数字媒体资料库程序设计软件包

    html-agility-pack-master.zip

    html-agility-pack-master

Global site tag (gtag.js) - Google Analytics