1、前端优化
网站性能优化是一个很综合的话题,涉及到服务器的配置和网站先后端程序等各个方面,我只是从实际经历出发,分享一下本身所尝试过的网站性能优化方法。之因此在标题上挂一个web2.0,是由于本文更偏重于中小网站的性能优化,我所使用的系统也是典型web2.0的LAMP架构。
首先讲讲前端的优化,用户访问网页的等待时间,有80%是发生在浏览器前端,特别是页面和页面中各类元素(图片、CSS、Javascript、 flash…)的下载之上。所以在不少状况下,相对于把大量的时间花在艰苦而繁杂的程序改进上,前端的优化每每能起到事半功倍的做用。雅虎最近将内部使用的性能测试工具yslow向第三方公开,并发布了著名的网站性能优化的十三条规则,建议你下载并安装yslow,并做为测评网站优化效果的工具。下面我挑其中特别有价值的具体说明一下优化的方法:
对于第一次访问您网站,还没有在浏览器cache中缓存您网站内容的用户,咱们能够作的事情包括:
1)减小一个页面访问所产生的http链接次数
对于第一次访问你网站的用户,页面所产生的http链接次数是影响性能的一个关键瓶颈。
对策:
- 尽可能简洁的页面设计,最大程度减小图片的使用,经过放弃一些没必要要的页面特效来减小javascript的使用。
- 使用一些优化技巧,好比利用图片的背景位移减小图片的个数;image map技术;使用Inline images将css图片捆绑到网页中。
- 尽可能合并js和css文件,减小独立文件个数。
2) 使用gzip压缩网页内容
使用gzip来压缩网页中的静态内容,可以显著减小用户访问网页时的等待时间(听说可达到60%)。主流的web服务器都支持或提供gzip压缩,若是使用apache服务器,只须要在配置文件中开启 mod_gzip(apache1.x)或mod_deflate(apache2.x)便可。凡是静态的页面,使用gzip压缩都可以显著提升服务器效率并减小带宽支出,注意图片内容自己已是压缩格式了,务必不要再进行压缩。
3)将CSS放在页面顶端,JS文件放在页面底端
CSS的引用要放在html的头部header中,JS文件引用尽可能放在页面底端标签的后面,主要的思路是让核心的页面内容尽早显示出来。不过要注意,一些大量使用js的页面,可能有一些js文件放在底端会引发一些难以预料的问题,根据实际状况适当运用便可。
4)使JS文件内容最小化
具体来讲就是使用一些javascript压缩工具对js脚本进行压缩,去除其中的空白字符、注释,最小化变量名等。在使用gzip压缩的基础上,对js内容的压缩可以将性能再提升5%。
5)尽可能减小外部脚本的使用,减小DNS查询时间
不要在网页中引用太多的外部脚本,首先,一次dns的解析过程会消耗20-120毫秒的时间;其次,若是在页面中引用太多的外部文件(如各类广告、联盟等代码),可能会由于外部文件的响应速度而将你的网站拖得很慢。若是不得不用,那么就尽可能将这些脚本放在页脚吧。不过有一点须要说起,就是浏览器通常只能并行处理同一域名下的两个请求,而对于不一样子的域名则不受此限制,所以适当将本站静态内容(css,js)放在其余的子域名下(如 static.xxx.com)会有利于提升浏览器并行下载网页内容的能力。
对于您网站的常常性访问用户,主要的优化思路就是最大限度利用用户浏览器的cache来减小服务器的开销。
1)在header中添加过时时间(Expires Header)
在header中给静态内容添加一个较长的过时时间,这样可使用户从此访问只读取缓存中的文件,而不会与服务器产生任何的交互。不过这样作也存在一些问题,当图片、CSS和js文件更新时,用户若是不刷新浏览器,就没法得到此更新。这样,咱们在对图片、css和js文件修改时,必需要进行重命名,才能保证用户访问到最新的内容。这可能会给开发形成不小的麻烦,由于这些文件可能被站点中的许多文件所引用。flickr提出的解决办法是经过url rewrite使不一样版本号的URL事实上指向同一个文件,这是一个聪明的办法,由于url级别的操做效率是很高的,能够给开发过程提供很多便利。
要理解为何这样作,必需要了解浏览器访问url时的工做机制:
a. 第一次访问url时,用户从服务器段获取页面内容,并把相关的文件(images,css,js…)放在高速缓存中,也会把文件头中的expired time,last modified, ETags等相关信息也一同保留下来。
b. 用户重复访问url时,浏览器首先看高速缓存中是否有本站同名的文件,若是有,则检查文件的过时时间;若是还没有过时,则直接从缓存中读取文件,再也不访问服务器。
c. 若是缓存中文件的过时时间不存在或已超出,则浏览器会访问服务器获取文件的头信息,检查last modifed和ETags等信息,若是发现本地缓存中的文件在上次访问后没被修改,则使用本地缓存中的文件;若是修改过,则从服务器上获取最新版本。
个人经验,若是可能,尽可能遵循此原则给静态文件添加过时时间,这样能够大幅度减小用户对服务器资源的重复访问。
2)将css和js文件放在独立外部文件中引用
将css和js文件放在独立文件中,这样它们会被单独缓存起来,在访问其余页面时能够从浏览器的高速缓存中直接读取。一些网站的首页多是例外的,这些首页的自身浏览可能并不大,但倒是用户访问网站的第一印象以及导向到其余页面的起点,也可能这些页面自己使用了大量的ajax局部刷新及技术,这时能够将 css和js文件直接写在页面中。
3)去掉重复的脚本
在IE中,包含重复的js脚本会致使浏览器的缓存不被使用,仔细检查一下你的程序,去掉重复引用的脚本应该不是一件很难的事情。
4)避免重定向的发生
除了在header中人为的重定向以外,网页重定向常在不经意间发生,被重定向的内容将不会使用浏览器的缓存。好比用户在访问www.xxx.com,服务器会经过301转向到www.xxx.com/,在后面加了一个“/”。若是服务器的配置很差,这也会给服务器带来额外的负担。经过配置apache的 alias或使用mod_rewrite模块等方法,能够避免没必要要的重定向。
还有一些,好比使用CDN分发机制、避免CSS表达式等、避免使用ETags等,由于不太经常使用,这里就再也不赘述了。
作完了上述的优化,能够试着用yslow测试一下网页的性能评分,通常均可以达到70分以上了。
固然,除了浏览器前端和静态内容的优化以外,还有针对程序脚本、服务器、数据库、负载的优化,这些更深层次的优化方法对技术有更高的要求。本文的后半部分将重点探讨后端的优化。
2、后端优化
上次写完web2.0网站前端优化篇以后,一直想写写后端优化的方法,今天终于有时间将思路整理了出来。
前端优化能够避免咱们形成无谓的服务器和带宽资源浪费,但随着网站访问量的增长,仅靠前端优化已经不能解决全部问题了,后端软件处理并行请求的能力、程序运 行的效率、硬件性能以及系统的可扩展性,将成为影响网站性能和稳定的关键瓶颈所在。优化系统和程序的性能能够从如下的方面来入手:
1)apache、mysql等软件的配置的优化
尽管apache和mysql等软件在安装后使用的默认设置足以使你的网站运行起来,可是经过调整mysql和apache的一些系统参数,仍是能够追求更高的效率和稳定性。这个领域中有不少专业的文章和论坛(好比: http://www.mysqlperformanceblog.com/),要想掌握也须要进行深刻的研究和实践,这里就不重点讨论了。
2)应用程序环境加速
这里仅以我最常应用的php开发环境为例,有一些工具软件能够经过优化PHP运行环境来达到提速的目的,其基本原理大体是将PHP代码预编译并缓存起来,而不须要改变任何代码,因此比较简单,能够将php的运行效率提高50%以上。比较经常使用的免费php加速工具备:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( http://turck-mmcache.sourceforge.net)、php accelebrator(www.php-accelerator.co.uk),还有收费的Zend Performance Suite
3)将静态内容和动态内容分开处理
apache是一个功能完善但比较庞大的web server,它的资源占用基本上和同时运行的进程数呈正比,对服务器内存的消耗比较大,处理并行任务的效率也通常。在一些状况下,咱们能够用比较轻量级的web server来host静态的图片、样式表和javascript文件,这样能够大大提高静态文件的处理速度,还能够减小对内存占用。我使用的web server是来自俄罗斯的nginx,其余选择方案还包括lighttpd和thttpd等。
4)基于反向代理的前端访问负载均衡
当一台前端服务器不足以应付用户访问时,经过前端机实现web访问的负载均衡是最快速可行的方案。经过apache的mod_proxy能够实现基于反向代理的负载均衡,这里推荐使用nginx作代理服务器,处理速度较apache更快一些。
5)应用缓存技术提升数据库效能,文件缓存和分布式缓存
数据库访问处理并发访问的能力是不少网站应用的关键瓶颈,在想到使用主从结构和多farm的方式构建服务器集群以前,首先应该确保充分使用了数据库查询的缓存。一些数据库类型(如mysql的innoDB)自身内置对缓存的支持,此外,还能够利用程序方法将经常使用的查询经过文件或内存缓存起来。好比经过 php中的ob_start和文件读写函数能够很方便的实现文件形式的缓存,而若是你拥有多台服务器,能够经过memcache技术经过分布式共享内存来对数据库查询进行缓存,不只效率高并且扩展性好,memcache技术在livejournal和Craigslist.org等知名网站应用中都获得了检验。
6)服务器运行状态的检测,找到影响性能的瓶颈所在
系统优化没有一劳永逸的方法,须要经过检测服务器的运行状态来及时发现影响性能的瓶颈,以及可能存在的潜在问题,由于网站的性能,永远取决于木桶中的短板。能够编写一些脚原本检测web服务的运行,也有一些开源的软件也提供了很好的功能
7)良好的扩展架构是稳定和性能的基础
一些技巧和窍门能够帮你度过眼前的难关,但要想使网站具有应付大规模访问的能力,则须要从系统架构上进行完全的规划,好在不少前人无私的把他们架构
网站的经验分享给咱们,使咱们能够少走甚多弯路。我最近读到的两篇有启发的文章:
- 从LiveJournal后台发展看大规模网站性能优化方法
- Myspace的六次重构
最后不得不提到程序编码和数据库结构对性能的影响,一系列糟糕的循环语句,一个不合理的查询语句、一张设计不佳的数据表或索引表,都足以会使应用程序运行的速度成倍的下降。培养全局思考的能力,养成良好的编程习惯,并对数据库运行机制有所了解,是提升编程质量的基础。