`
liyao20050101
  • 浏览: 14328 次
  • 性别: 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 

分享到:
评论

相关推荐

    spring cloud config client 服务配置中心 客户端

    Spring Cloud Config Client是Spring Cloud生态系统中的一个组件,它允许微服务应用从远程配置服务器获取配置信息,实现配置的集中管理和动态更新。这个组件是服务配置中心的重要组成部分,它极大地简化了分布式系统...

    cloud-config-client 客户端示例代码

    Spring Cloud为了解决这个问题,引入了Cloud Config Server和Cloud Config Client组件,使得配置管理变得集中、便捷。本文将详细讲解`cloud-config-client`客户端的使用,以及如何与`spring-cloud`和`spring-boot`...

    cloud_config_server_client

    本教程将详细介绍如何搭建Spring Cloud Config的Server端和Client端,以实现远程配置管理。 **一、Spring Cloud Config Server** 1. **配置服务器初始化** - 首先,我们需要创建一个新的Spring Boot项目,并添加`...

    wildfly-client-config-1.0.1.Final-API文档-中文版.zip

    赠送jar包:wildfly-client-config-1.0.1.Final.jar; 赠送原API文档:wildfly-client-config-1.0.1.Final-javadoc.jar; 赠送源代码:wildfly-client-config-1.0.1.Final-sources.jar; 赠送Maven依赖信息文件:...

    wildfly-client-config-1.0.1.Final-API文档-中英对照版.zip

    赠送jar包:wildfly-client-config-1.0.1.Final.jar; 赠送原API文档:wildfly-client-config-1.0.1.Final-javadoc.jar; 赠送源代码:wildfly-client-config-1.0.1.Final-sources.jar; 赠送Maven依赖信息文件:...

    cas-client-autoconfig-support, Apereo Java客户端支持基于注释的配置.zip

    cas-client-autoconfig-support, Apereo Java客户端支持基于注释的配置 cas-client-autoconfig-support 为CAS Java客户端提供基于注释的配置支持的库,这个项目是作为Unicon的开源支持程序的一部

    cloud-config-client:节点的Cloud Config客户端

    用于NodeJS的Spring Cloud Config Client 要求:NodeJS 8+ 欢迎提出功能要求。 安装 npm i cloud-config-client 用法 const client = require ( "cloud-config-client" ) ; client . load ( { application : ...

    spring boot整合CAS Client实现单点登陆验证的示例

    &lt;artifactId&gt;cas-client-autoconfig-support &lt;version&gt;1.4.0-GA ``` 然后,我们需要在 application.properties 文件中添加 CAS 服务器的 URL: ```properties cas.server-url-prefix=http://127.0.0.1 cas.server...

    Makefile.config for SSD

    Makefile.config for SSD detection framework

    sshd_config默认配置

    sshd_config默认配置

    Config_Tools_for_i.MX_v10_x64

    面向i.MX的配置工具V10,支持IMX6、IMX7、IMX8、rt1052

    Python库 | os_client_config-1.22.0-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:os_client_config-1.22.0-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    config Juniper BGP for netscreen.pdf

    config Juniper BGP for netscreen.pdf

    飞信多开操作方式 Client.config

    `Client.config`是飞信客户端的应用程序配置文件,使用XML格式存储,包含了应用程序的各种设置。在默认情况下,飞信被设置为单例模式,即在同一台计算机上只能运行一个飞信实例。若想开启多个飞信窗口进行多任务操作...

    pkg-config windows版本

    pkg-config 是一个在软件开发中广泛使用的工具,特别是在C和C++编程中,它帮助开发者管理库依赖关系。这个工具最初由 Red Hat 的 Keith Packard 创建,目的是简化配置过程,确保编译时链接到正确的库版本。在Windows...

    Spring Cloud Config Demo

    在Spring Cloud Config中,主要涉及两个核心组件:Config Server(配置服务器)和Config Client(配置客户端)。Config Server存储所有应用的配置,并提供API供Config Client获取配置。Config Client则集成到各个...

    config-server.zip

    4. 使用POST请求向Config Server的`/bus/refresh`端点发送更新指令,如:`curl -X POST -H "Content-Type: application/json" -d '["client-service"]' http://localhost:8888/bus/refresh` 5. Spring Cloud Bus接收...

    ClientDriver.exe.config

    ClientDriver.exe.config

    Keyconfig for Firefox

    Firefox经典插件,可修改键盘快捷键。

Global site tag (gtag.js) - Google Analytics