`
wangrl
  • 浏览: 152068 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何利用HTTP缓存提高网页性能

阅读更多
http://blogold.chinaunix.net/u1/45336/article_134715.html

网站的性能(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>

还有,同一个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的配置。
分享到:
评论

相关推荐

    Android WebView 实现缓存网页数据

    在Android开发中,`WebView` 是一个非常重要的组件,它允许开发者在应用程序内嵌入一个浏览器,用于显示网页内容。...同时,理解和掌握 `WebView` 缓存机制也有助于优化应用程序的性能和资源利用。

    Http页面缓存机制

    浏览器端缓存机制的重要性在于它可以减少浏览器端性能问题,提高用户体验。浏览器端缓存机制可以分为两类: Cache-Control、Etag、Expires、Last-Modified 和 Vary。这些规则可以控制浏览器缓存的行为,影响浏览器...

    引入缓存机制提升性能 提高PHP编程效率

    - 开启压缩模块:启用Apache的mod_deflate模块,可以有效地减少传输的数据量,从而提高网页加载速度。 通过以上策略的应用,开发者可以显著提高PHP程序的性能,从而提供更好的用户体验。值得注意的是,在实际应用...

    asp.net 提高网站速度及如何利用缓存

    ***网站性能优化是提升用户体验的重要途径,而缓存技术正是实现这一目标的有效手段。***框架内置了多种缓存机制,能够帮助开发者显著提升网站响应速度和处理能力。在深入探讨***缓存技术之前,先了解缓存的基本概念...

    网页缓存提取器

    了解网页缓存的工作机制以及如何利用提取器,有助于我们更好地优化网页性能、解决网络问题,甚至进行数据分析和数据恢复。在日常使用中,我们应该根据实际需求选择合适的缓存策略,以达到最佳的用户体验和网络效率。

    缓存网页方法

    为了提高用户体验,减少服务器负载,并加快页面加载速度,一种常见的技术手段就是网页缓存。本文将深入探讨网页缓存的相关概念、实现原理以及具体的配置方法。 #### 一、网页缓存的重要性 网页缓存可以显著提升...

    Http页面缓存机制(转)

    HTTP页面缓存机制是网络应用中的一个重要组成部分,它极大地提高了网页加载速度,减少了服务器压力,并优化了用户体验。在浏览器与服务器之间的通信中,缓存扮演了中间者的角色,将频繁访问的数据暂存到本地,以便在...

    网页缓存到本地.zip

    当应用需要加载网络上的HTML、CSS、JavaScript等资源时,为了提高用户体验,尤其是在离线或者网络不稳定的情况下,可以利用网页缓存策略将数据保存在本地。"网页缓存到本地.zip"这个压缩包文件很可能包含了一个示例...

    初探浏览器缓存实现原理-提高性能

    浏览器缓存是优化网站性能的关键技术之一,通过在客户端存储网页资源,如HTML、CSS、JavaScript文件和图片等,减少对网络带宽的消耗,加快页面加载速度,提升用户体验,并减轻服务器的压力。本文将深入探讨浏览器...

    jQuery缓存性能分析比较案例

    在提供的压缩包文件"jQuery缓存性能分析比较案例"中,可能包含了一个网页或一系列的JavaScript脚本,它们展示了不同缓存策略对jQuery性能的影响。通过运行和分析这些案例,我们可以直观地理解缓存在提升jQuery性能上...

    Asp.NET性能优化之局部缓存

    总结来说,局部缓存是Asp.NET性能优化的关键组成部分,能够有效提高网站的响应速度和资源利用率。开发者可以根据具体需求选择合适的缓存策略,如CSS、SSI或ESI,以实现最佳的性能效果。同时,理解和掌握这些技术可以...

    基于ASP.NET缓存与分页策略优化Web数据查询性能

    ### 基于ASP.NET缓存与分页策略优化Web数据查询性能 #### 概述 随着互联网技术的快速发展和Web应用的普及,提高Web数据查询性能成为了提升用户体验的关键因素。传统的分页查询方法虽然能够一定程度上减轻数据库的...

    asp缓存类提高处理速度源码

    为了更高效地利用缓存,我们可以自定义缓存类。自定义缓存类通常包括以下功能: 1. **键值对存储**:模仿哈希表或字典的数据结构,通过键(key)快速查找值(value)。这允许我们根据需要存储任意类型的数据,并...

    浏览器HTTP缓存机制

    HTTP缓存机制通过减少网络流量和提高响应速度,极大地优化了用户的Web体验。了解这些基本概念有助于开发者更好地控制资源的缓存行为,进一步提升应用性能。为了深入了解HTTP缓存机制,建议参考以下链接: - [Web ...

    用来检测网页中错误和缓存

    在Web开发和优化中,这样的工具至关重要,因为它们能帮助开发者识别性能瓶颈,提高网页加载速度,提升用户体验。 描述中的“安装后用来检测网页中出现的问题,和缓存~~”进一步强调了这个工具的主要用途。它不仅...

    浏览器HTTP缓存运行机制流程图.zip

    浏览器HTTP缓存是提高网页加载速度和降低服务器压力的关键机制,它主要分为两种类型:强缓存(Strong Cache)和协商缓存(Conditional Cache)。理解这两种缓存的工作原理对于优化Web应用性能至关重要。 1. 强缓存...

    PHP 缓存 PHP 缓存

    ### PHP 缓存详解 #### 一、缓存的基本概念 ...综上所述,合理利用缓存可以极大地提升 Web 应用的性能和用户体验。但在实际应用中,还需要结合具体的业务场景和技术栈来选择合适的缓存策略和技术实现。

    .net环境下的缓存技术.

    在.NET环境下,缓存技术是提高应用程序性能、稳定性和可用性的重要手段。缓存技术可以解决性能问题、稳定性问题和可用性问题。 缓存技术可以解决的问题包括: * 性能问题:缓存可以将相应数据存储起来以避免数据的...

    查看缓存 清除缓存

    1. **缓存的作用**:缓存的主要目的是优化性能,当用户首次打开一个应用或访问一个网页时,相关数据会被保存在本地,下次访问时可直接从缓存读取,减少加载时间。 2. **缓存的类型**:Android应用中的缓存通常分为...

    页面的缓存与不缓存设置及html页面中meta的作用

    在网页开发中,缓存是一种优化加载速度和减少网络带宽消耗的重要技术。它涉及到浏览器、中间缓存服务器以及Web服务器之间的交互。...理解并正确运用这些设置,对于提高网站性能和用户体验至关重要。

Global site tag (gtag.js) - Google Analytics