进行优化前,关键是剖析当前的web性能,找到性能瓶颈,从而确定最需改进的地方;如果精力有限,首先将精力放在能明显提升性能的改进点上;
《高性能网站建设指南》提出了一个性能黄金法则:
只有10%-20%的最终用户响应时间花在了下载HTML文档上;其余的80%-90%的时间花在了下载页面中的所有组件上。
由于本文将实施一个完整的优化流程,所以,我们还是从后台开始;
案例说明:
优化之前的网站规模:
2个js、一个页头、一个页脚;3个css;
类型:博客类站点;后台逻辑简单;首页不到10个sql查询;
首页html文档52kb;
第一步:后台优化,启用页面缓存;
实验站点首页后台逻辑并不复杂,不超过10个Sql查询,通过查看时间线,本站在获取HTML文档时,花费的时间不到总响应时间的20%,优化之前没有使用缓存,所有的数据都是从数据库读取,这里,我们使用静态页面缓存,将首页整个页面完全的存放在缓存中(关于YII静态页面缓存的使用,参考这里);
通过查看html文档的生成时间来检测优化效果;
首字节时间为376ms;html生成的时间大大缩短,后台时间减少了一倍。
优化前:
优化后:
第二步,DNS域名解析加速:
DNS解析是用户访问站点的第一步,在此之前,你的网站无法做任何事情;
站点的DNS解析时间不应该超过500ms,如果站点原始DNS解析时间过长,就该考虑考虑使用第三方解析加速服务;
实验站点的原始DNS解析较慢,平均耗时1017ms,算是非常长的;对于DNS加速,可以使用DNS域名解析加速服务,本站点采用的国内的一款免费DNS加速服务DNSPOD,效果还不错,使用后平均耗时降到370ms;
加速前测试:
使用DNS域名解析服务之后的测试:
第三步:使用CDN加速;
采用第三方CDN加速,时间缩短到2.1s;从下图中看到主要的耗时在于并行下载的个数有些低,如果能够提升并行下载量的个数,那么整体加载时间就会降低;
注:个人建议,启用CDN最好放在最后一步,等将站点本身的优化都做完了之后,再启用CDN可以明显的看到优化效果。(开启CDN后,由于有CDN缓存的原因,观测站点的本身的优化就不是很方便了);
第四步,采用多台服务器提高并行加载量:
原理:一个浏览器对与同一域名的并行下载的个数默认是2个, HTTP.1.0中规定的是4个。这样,我们可以使用不同的域名来提升下载的速度;
观察上图中的下载数量,第一次并行下载的个数是4个,初始认为是浏览器对于同一个域名来源的下载所限导致;于是考虑将部分静态文件分别放在不同的服务器上;通过把css和js放在不同服务器上;结果并不理想,发现并未提高速度。
想到在哪曾看到过,浏览器必须得把放在页头的css和js下载完成了之后才会开始下载其它的静态组件;
关于并行下载这点上,后续将继续实验是否还有优化的空间。
第五步,合并脚本和样式表;
本站首页使用了2个js和3个css。如果采用朴素复制的方式,将js和css都分别整合到一个文件中,不但操作麻烦,而且不方便后期的管理。网络上有不少合并的工具,本站采用了CSS和JS合并优化工具-minify(下载地址:http://code.google.com/p/minify/)。如果使用的YII框架,更有YII整合版(minscript Extension),简单几步的配置,就自动将页面所有的js和css文件合并;
关于minscript Extension的使用,请参考:https://bitbucket.org/TeamTPG/minscript/wiki/Usage
第六步,压缩css/js/html/xml;
不同的web服务器设置方式有所差别,本站使用的Linux/apache,
在web根目录下的.htaccess文件中添加以下代码即可:
#set compress
<ifmodule mod_deflate.c>
AddOutputFilter DEFLATE html xml php js css
</ifmodule>
通过firefox工具可看到,压缩前,html文档的大小是25KB;合并后的js大小为138KB;
压缩后,html文档大小为6.2KB。js大小为39.8KB;减少2/3的传输时间;
第六步,最大化的减少HTTP请求;
添加Expires头, 启用静态内容缓存,将jpg、gif等文件缓存;
方法也是在.htaccess中添加:
# Image and Flash content Caching for One Month
<FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf)$”>
Header set Cache-Control “max-age=2592360″
</FilesMatch>
结论
查看最终的测试结果,整体实现了较大的性能提升,最终页面展现时间为1.62s(测试使用的是一个第三方web测速工具,所有测试结果是在第三方本地无缓存的条件下进行)。仔细观察本站最后几个加载项:有一个第三方网站的广告(加载广告的时刻,页面已经全部呈现,对用户体验影响不大),以及cnzz的统计数据。这样看来,在第12项加载完后,整个页面就完整的呈现在用户面前,优化最终结果是1.1s,较优化前加载速度提升2s;由于物理条件(虚拟机、国外站点)所限,本次优化就到此为止(后续将在并行下载上做做文章,看是否有进一步提升空间)。
本次优化主要使用的是前端优化,其中大部分规则来自于这本书的指导《高性能网站建设指南》;如果你的web前端部分还没有充分优化,强烈建议读读这本书;
这是一本你只需画上三小时就能看完,但收获价值远远大于付出的一本书。
附上本书的目录:
绪言A:前端性能的重要性
第1章:规则1——减少HTTP请求
第2章:规则2——使用内容发布网络
第3章:规则3——添加Expires头
第4章:规则4——压缩组件
第5章:规则5——将样式表放在顶部
第6章:规则6——将脚本放在底部
第7章:规则7——避免CSS表达式
第8章:规则8——使用外部JavaScript和CSS
第9章:规则9——减少DNS查找
第10章:规则10——精简JavaScript
第11章:规则11——避免重定向
第12章:规则12——移除重复脚本
第13章:规则13——配置ETag
第14章:规则14——使AjaX可缓存
第15章:析构十大网站
页面大小、响应时间、YSlow等级
如何进行测试
Posted by: 大CC | JAN24,2013
博客:blog.me115.com [订阅]
微博:新浪微博
相关推荐
### Nginx 高性能 WEB 服务器系列知识点详解 #### 1. Nginx 入门简介 **Nginx** 是一款广受...通过对上述知识点的学习和实践,可以更好地掌握 Nginx 的配置和优化技巧,为企业搭建高效稳定的 WEB 服务提供有力支持。
- **静态资源缓存**:启用浏览器缓存和CDN缓存,提高静态资源的加载速度。 - **动态内容缓存**:对于频繁访问的动态内容,可以考虑使用应用层缓存。 #### 六、管理 **6.1 推荐的IBM Workplace Web Content ...
定期审查并精简客户端脚本可以显著提高页面加载速度。 - **Reduce memory leaks dramatically with the “using” statement (利用“using”语句大幅减少内存泄漏)** - .NET中的`using`语句提供了一种优雅地管理...
- **不要忽视性能优化:** 忽视性能调优可能会导致用户体验下降。 - **不要使用过时的技术或库:** 使用过时的技术可能会引入安全风险,并增加维护成本。 **2.3 需要考虑的因素** - **兼容性问题:** 确保当前使用...
- **性能优化**:提高网站加载速度,减少HTTP请求,压缩资源文件等都是必要的措施。 - **安全性**:保护用户数据安全,例如使用HTTPS协议、验证用户输入等。 综上所述,这个项目不仅是一次技术实践的机会,也为学生...
- 性能提升:此版本可能包含了对底层代码的优化,以提高服务性能。 - 安全改进:可能修复了已知的安全漏洞,增强了系统的安全性。 - 错误修复:针对前一版本出现的问题进行修复,确保稳定运行。 - 新功能添加:可能...
**8.4 站点性能优化** - **性能瓶颈**:分析了影响WebGIS站点性能的因素。 - **服务器端/客户端优化**:提出了针对服务器端和客户端的优化策略。 - **ASP.NET性能优化**:给出了使用ASP.NET技术进行性能优化的具体...
- **缓存策略**:提供缓存机制,减少服务器负载,提高页面加载速度。 8. **监控与管理** - **日志和跟踪**:详细的日志记录和跟踪功能,用于故障排查和性能分析。 - **管理工具**:提供图形化管理控制台,方便...
- 如果选择自建服务器,可以使用HTTP/2协议,提高网站加载速度。 4. **JavaScript的应用** - 响应式设计:利用JavaScript和CSS实现响应式布局,确保网站在不同设备上都能良好显示。 - 动态交互:通过JavaScript...
- **性能优化**:通过对代码进行分析和测试,识别并消除性能瓶颈,提高设备的响应速度和数据吞吐量。 #### 5. 实战案例分析 - 书中通过一系列实际的设备驱动开发案例,详细介绍了如何从零开始设计和实现一个驱动...
- **性能优化**:提高网页加载速度的方法。 - **SEO优化**:如何进行搜索引擎优化,提高网站排名。 ##### 18. 高级CSS技术(Advanced CSS Techniques) - **伪类和伪元素**:使用`:hover`、`:first-child`等伪类和`...
5. **优化性能**:使用HTTP/2协议,启用服务器推送,以及正确配置缓存策略,可以提高HTTPS站点的加载速度。 在“blog-examples”项目中,我们可以看到实现这些概念的实际代码和配置示例。通过研究源代码,我们可以...
超越今天各自为营的 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 以互相交换组件的地方 以互相交换组件的地方以互相交换组件的地方 以...