提高网站性能中网站服务器的改进
文章出处:蓝色理想 作者:sivadu 发布时间:2008-05-16
在本系列的第一节中,讲了 提高网站性能中网站“内容”有关的10条原则 。除了在网站在内容上的改进外,在网站服务器端上也有需要注意和改进的地方,它们包括:
使用内容分发网络
为文件头指定Expires或Cache-Control
Gzip压缩文件内容
配置ETag
尽早刷新输出缓冲
使用GET来完成AJAX请求
11、使用内容分发网络
用户与你网站服务器的接近程度会影响响应时间的长短。把你的网站内容分散到多个、处于不同地域位置的服务器上可以加快下载速度。但是首先我们应该做些什么呢?
按地域布置网站内容的第一步并不是要尝试重新架构你的网站让他们在分发服务器上正常运行。根据应用的需求来改变网站结构,这可能会包括一些比较复杂的任务,如在服务器间同步Session状态和合并数据库更新等。要想缩短用户和内容服务器的距离,这些架构步骤可能是不可避免的。
要记住,在终端用户的响应时间中有80%到90%的响应时间用于下载图像、样式表、脚本、Flash等页面内容。这就是网站性能黄金守则。和重新设计你的应用程序架构这样比较困难的任务相比,首先来分布静态内容会更好一点。这不仅会缩短响应时间,而且对于内容分发网络来说它更容易实现。
内容分发网络(Content Delivery Network,CDN)是由一系列分散到各个不同地理位置上的Web服务器组成的,它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网络上的靠近程度来指定的。例如,拥有最少网络跳数(network hops)和响应速度最快的服务器会被选定。点击这里查看网页制作教程频道内容
一些大型的网络公司拥有自己的CDN,但是使用像 Akamai Technologies ,Mirror Image Internet , 或者 Limelight Networks 这样的CDN服务成本却非常高。对于刚刚起步的企业和个人网站来说,可能没有使用CDN的成本预算,但是随着目标用户群的不断扩大和更加全球化,CDN就是实现快速响应所必需的了。以Yahoo来说,他们转移到CDN上的网站程序静态内容节省了终端用户20%以上的响应时间。使用CDN是一个只需要相对简单地修改代码实现显著改善网站访问速度的方法。
12、为文件头指定Expires或Cache-Control
这条守则包括两方面的内容:
对于静态内容:
设置文件头过期时间Expires的值为“Never expire”(永不过期)
对于动态内容:
使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求
网页内容设计现在越来越丰富,这就意味着页面中要包含更多的脚本、样式表、图片和Flash。第一次访问你页面的用户就意味着进行多次的HTTP请求,但是通过使用Expires文件头就可以使这样内容具有缓存性。它避免了接下来的页面访问中不必要的HTTP请求。Expires文件头经常用于图像文件,但是应该在所有的内容都使用他,包括脚本、样式表和Flash等。
浏览器(和代理)使用缓存来减少HTTP请求的大小和次数以加快页面访问速度。Web服务器在HTTP响应中使用Expires文件头来告诉客户端内容需要缓存多长时间。下面这个例子是一个较长时间的Expires文件头,它告诉浏览器这个响应直到2010年4月15日才过期。
Expires: Thu, 15 Apr 2010 20:00:00 GMT
如果你使用的是Apache服务器,可以使用ExpiresDefault来设定相对当前日期的过期时间。下面这个例子是使用ExpiresDefault来设定请求时间后10年过期的文件头:
ExpiresDefault "access plus 10 years"
要切记,如果使用了Expires文件头,当页面内容改变时就必须改变内容的文件名。依Yahoo!来说我们经常使用这样的步骤:在内容的文件名中加上版本号,如yahoo_2.0.6.js。
使用Expires文件头只有会在用户已经访问过你的网站后才会起作用。当用户首次访问你的网站时这对减少HTTP请求次数来说是无效的,因为浏览器的缓存是空的。因此这种方法对于你网站性能的改进情况要依据他们“预缓存”存在时对你页面的点击频率(“预缓存”中已经包含了页面中的所有内容)。Yahoo!建立了一套测量方法,我们发现所有的页面浏览量中有75~85%都有“预缓存”。通过使用Expires文件头,增加了缓存在浏览器中内容的数量,并且可以在用户接下来的请求中再次使用这些内容,这甚至都不需要通过用户发送一个字节的请求。
13、Gzip压缩文件内容
网络传输中的HTTP请求和应答时间可以通过前端机制得到显著改善。的确,终端用户的带宽、互联网提供者、与对等交换点的靠近程度等都不是网站开发者所能决定的。但是还有其他因素影响着响应时间。通过减小HTTP响应的大小可以节省HTTP响应时间。
从HTTP/1.1开始,web客户端都默认支持HTTP请求中有Accept-Encoding文件头的压缩格式:
Accept-Encoding: gzip, deflate
如果web服务器在请求的文件头中检测到上面的代码,就会以客户端列出的方式压缩响应内容。Web服务器把压缩方式通过响应文件头中的Content-Encoding来返回给浏览器。点击这里查看网页制作教程频道内容
Content-Encoding: gzip
Gzip是目前最流行也是最有效的压缩方式。这是由GNU项目开发并通过 RFC 1952 来标准化的。另外仅有的一个压缩格式是deflate,但是它的使用范围有限效果也稍稍逊色。
Gzip大概可以减少70%的响应规模。目前大约有90%通过浏览器传输的互联网交换支持gzip格式。如果你使用的是Apache,gzip模块配置和你的版本有关:Apache 1.3使用mod_zip,而Apache 2.x使用moflate。
浏览器和代理都会存在这样的问题:浏览器期望收到的和实际接收到的内容会存在不匹配的现象。幸好,这种特殊情况随着旧式浏览器使用量的减少在减少。Apache模块会通过自动添加适当的Vary响应文件头来避免这种状况的出现。
服务器根据文件类型来选择需要进行gzip压缩的文件,但是这过于限制了可压缩的文件。大多数web服务器会压缩HTML文档。对脚本和样式表进行压缩同样也是值得做的事情,但是很多web服务器都没有这个功能。实际上,压缩任何一个文本类型的响应,包括XML和JSON,都值得的。图像和PDF文件由于已经压缩过了所以不能再进行gzip压缩。如果试图gizp压缩这些文件的话不但会浪费CPU资源还会增加文件的大小。
Gzip压缩所有可能的文件类型是减少文件体积增加用户体验的简单方法。
14、配置ETag
Entity tags(ETags)(实体标签)是web服务器和浏览器用于判断浏览器缓存中的内容和服务器中的原始内容是否匹配的一种机制(“实体”就是所说的“内容”,包括图片、脚本、样式表等)。增加ETag为实体的验证提供了一个比使用“last-modified date(上次编辑时间)”更加灵活的机制。Etag是一个识别内容版本号的唯一字符串。唯一的格式限制就是它必须包含在双引号内。原始服务器通过含有ETag文件头的响应指定页面内容的ETag。
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195
稍后,如果浏览器要验证一个文件,它会使用If-None-Match文件头来把ETag传回给原始服务器。在这个例子中,如果ETag匹配,就会返回一个304状态码,这就节省了12195字节的响应。 GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified
ETag的问题在于,它是根据可以辨别网站所在的服务器的具有唯一性的属性来生成的。当浏览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时ETag就会不匹配,这种情况对于使用服务器组和处理请求的网站来说是非常常见的。默认情况下,Apache和IIS都会把数据嵌入ETag中,这会显著减少多服务器间的文件验证冲突。
Apache 1.3和2.x中的ETag格式为inode-size-timestamp。即使某个文件在不同的服务器上会处于相同的目录下,文件大小、权限、时间戳等都完全相同,但是在不同服务器上他们的内码也是不同的。
IIS 5.0和IIS 6.0处理ETag的机制相似。IIS中的ETag格式为Filetimestamp:ChangeNumber。用ChangeNumber来跟踪IIS配置的改变。网站所用的不同IIS服务器间ChangeNumber也不相同。 不同的服务器上的Apache和IIS即使对于完全相同的内容产生的ETag在也不相同,用户并不会接收到一个小而快的304响应;相反他们会接收一个正常的200响应并下载全部内容。如果你的网站只放在一台服务器上,就不会存在这个问题。但是如果你的网站是架设在多个服务器上,并且使用Apache和IIS产生默认的ETag配置,你的用户获得页面就会相对慢一点,服务器会传输更多的内容,占用更多的带宽,代理也不会有效地缓存你的网站内容。即使你的内容拥有Expires文件头,无论用户什么时候点击“刷新”或者“重载”按钮都会发送相应的GET请求。
如果你没有使用ETag提供的灵活的验证模式,那么干脆把所有的ETag都去掉会更好。Last-Modified文件头验证是基于内容的时间戳的。去掉ETag文件头会减少响应和下次请求中文件的大小。微软的这篇支持文稿 讲述了如何去掉ETag。在Apache中,只需要在配置文件中简单添加下面一行代码就可以了:
FileETag none
15、尽早刷新输出缓冲
当用户请求一个页面时,无论如何都会花费200到500毫秒用于后台组织HTML文件。在这期间,浏览器会一直空闲等待数据返回。在PHP中,你可以使用flush()方法,它允许你把已经编译的好的部分HTML响应文件先发送给浏览器,这时浏览器就会可以下载文件中的内容(脚本等)而后台同时处理剩余的HTML页面。这样做的效果会在后台烦恼或者前台较空闲时更加明显。
输出缓冲应用最好的一个地方就是紧跟在之后,因为HTML的头部分容易生成而且头部往往包含CSS和JavaScript文件,这样浏览器就可以在后台编译剩余HTML的同时并行下载它们。点击这里查看网页制作教程频道内容 例子:
... <!-- css, js -->
<!--p flush();-->
... <!-- content -->
为了证明使用这项技术的好处,Yahoo!搜索 率先研究并完成了用户测试。
16、使用GET来完成AJAX请求
Yahoo!Mail 团队发现,当使用XMLHttpRequest时,浏览器中的POST方法是一个“两步走”的过程:首先发送文件头,然后才发送数据。因此使用GET最为恰当,因为它只需发送一个TCP包(除非你有很多cookie)。IE中URL的最大长度为2K,因此如果你要发送一个超过2K的数据时就不能使用GET了。
一个有趣的不同就是POST并不像GET那样实际发送数据。根据 HTTP规范 ,GET意味着“获取”数据,因此当你仅仅获取数据时使用GET更加有意义(从语意上讲也是如此),相反,发送并在服务端保存数据时使用POST。
分享到:
相关推荐
通过这些深入且实用的内容,读者能够了解到如何在实际环境中对Linux服务器进行性能调优,从而提高系统的整体效能和稳定性。本书不仅适合Linux运维人员,也适合对Linux性能优化感兴趣的开发人员和系统架构师,是一本...
### Web服务器性能测试报告知识点解析 #### 一、测试背景与目标 - **测试目的**:通过对Web服务器进行性能测试,旨在评估系统在特定负载下的响应时间与稳定性,特别是针对大量用户同时在线的情况。 - **具体目标**...
根据提供的文件信息,我们可以从以下几个方面来探讨存储服务器性能测试的相关知识点: ...希望通过上述分析能够帮助大家更好地理解存储服务器性能测试的相关知识,并在未来的工作实践中加以运用。
例如,可以设置较大的缓冲区大小和较短的刷新间隔,以减少磁盘写入次数,从而提高性能。 ##### 4. NFS版本的选择 选择合适的NFS版本也是关键。通常来说,新版本的NFS协议会包含更多的性能改进和安全特性。例如,...
通过合理的代码优化、工具运用、服务器配置和持续改进,我们可以显著提高网站的加载速度和用户体验,这对于任何在线业务的成功都是至关重要的。《JAVAEYE网站结构解密.pdf》这样的资源,为我们提供了深入学习和实践...
* 服务器IO性能评估可以帮助管理员和开发者进行服务器系统的优化和改进,提高服务器系统的整体性能和稳定性。 服务器IO性能评估是服务器系统性能优化和改进的重要步骤,旨在了解服务器磁盘的性能瓶颈,进而进行优化...
- **使用运行时样式**:这种方式可以在运行时动态改变组件的样式,而无需重新绘制整个组件,从而提高性能。 - **改善 Repeater 对象的性能**:Repeater 组件用于重复显示数据集合中的项。通过优化 Repeater 的数据...
通过在网络层流量中引入中间件,如“分配装置”,可以根据应用服务器的工作能力对流量进行分区,从而提高整体性能。这种改进的DPS模型能够更好地处理网络层流量,有效提升服务器的性能。 在此基础上,透明性和任务...
文件中提出的基于改进时序卷积网络的云服务器性能预测模型(ATCN模型)旨在解决这些问题。 二、ATCN模型概述 ATCN模型以CPU利用率作为衡量主机过载的标准,通过构建N+1维能耗向量,利用多维性能指标来建立输入向量...
Tengine是阿里巴巴集团旗下的淘宝网针对Nginx的一些局限性进行改进后所开发的一款高性能Web服务器。Nginx自推出以来,以其出色的性能、较低的资源消耗和强大的并发能力,在全球范围内迅速获得了广泛的应用,成为了仅...
网站性能分析是持续改进网站性能的基础。有效的工具可以帮助我们更好地理解性能瓶颈所在,并采取相应的优化措施。 **3.1 快速了解网站性能** - **3.1.1 使用YSlow进行性能分析**:YSlow是一款由Yahoo开发的Firefox...
在Linux系统中,高性能服务器编程是一项关键技能,它涉及到系统级优化、并发处理、网络通信、内存管理等多个方面。游双的《Linux高性能服务器编程》一书深入探讨了这些主题,并提供了配套的源代码供读者实践和学习。...
标题 "freyja 将引入另外一项功能大幅提高服务器性能" 提到的是一个名为 "freyja" 的工具或项目,它即将推出的新特性旨在显著提升服务器的运行效率。根据描述中的 "博文链接",我们可以推断这是一篇在 iteye.com ...
总结来说,服务器性能优化是一个综合性的过程,涉及硬件、操作系统、应用程序等多个层面的协同改进。通过对服务器并发处理能力的科学评估和针对性优化,可以显著提升服务器的运行效率和服务质量,从而更好地支持业务...
Web组件分离是指将网站的不同组成部分(如静态资源、动态内容等)部署在不同的服务器上,以提高性能。具体策略包括: - **图片服务器分离**:将图片部署在独立的服务器上,并为其分配独立的新域名。这样做可以利用...
在构建和运行大型Java网站的过程中,性能优化是至关重要的,它直接影响着用户体验、服务器资源的利用率以及业务的可扩展性。本实战指南将探讨从前端网络到后端大促的全链路性能优化策略,旨在提升网站的整体效率。 ...
本文将探讨如何配置MySQL服务器以提高性能,包括硬件配置、数据库配置、查询优化和维护策略。 通过上述的硬件配置、软件配置、查询优化和维护策略,可以显著提高MySQL服务器的性能。性能优化是一个持续的过程,需要...
《流媒体服务器存储子系统高性能I/O接口的研究与实现》一文深入探讨了如何在流媒体服务器的存储子系统中实现高性能的I/O接口,以克服磁盘I/O瓶颈,提升流媒体服务的效率和质量。 #### 系统结构与实现方案 流媒体...