一、后端强化
中文网站操控性强化是两个很综合的热门话题,牵涉到伺服器的实用性和中文网站其间端流程等方方面面,我只是从实际经历起程,撷取呵呵自己所试著过的中文网站操控性强化方式。或许在副标题上挂两个web2.0,是因为责任编辑更偏重于中小型中文网站的操控性强化,我所采用的系统也是众所周知web2.0的LAMP构架。
首先谈谈后端强化,使用者出访页面的等候时间,有80%是发生在应用流程后端,不光是页面和页面中各种原素(相片、CSS、Javascript、 flash…)的浏览其内。因此在很多情况下,相对把大量的时间花在艰辛而繁复的流程改良上,后端强化往往能起著四两拨千斤的作用。AOL最近将内部采用的操控性IOyslow向服务器端公开,并发布了著名的中文网站操控性强化的十六条准则,建议你浏览并加装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)放到其他的子域名下(如http://static.xxx.com)会有利于提高应用流程并行浏览页面文本的能力。
对您中文网站的经常性出访使用者,主要的强化思路就是最大限度利用使用者应用流程的cache来增加伺服器的开销。
1)在header中添加过期时间(Expires Header)
在header中给动态文本添加两个较长的过期时间,这样可以采使用者今后出访只读取内存中的文档,而不会与伺服器造成任何的交互。不过这样做也存在许多问题,当相片、CSS和js文档更新时,使用者如果不刷新应用流程,就无法获得此更新。这样,我们在对相片、css和js文档修改时,必须要进行重命名,才能保证使用者出访到最新的文本。这可能会给开发造成不小的麻烦,因为这些文档可能被站点中的许多文档所引用。flickr提出的解决办法是通过url rewrite使不同版本号的URL事实上指向同两个文档,这是两个聪明的办法,因为url级别的操作工作效率是很高的,可以给开发过程提供不少便利。
要理解为什么这样做,必须要了解应用流程出访url时的工作机制:
s,js…)放到高速内存中,也会把文档头中的expired time,last modified, ETags等相关信息也一同保留下来。
b. 使用者重复出访url时,应用流程首先看高速内存中是否有本站同名的文档,如果有,则检查文档的过期时间;如果仍未过期,则直接从内存中读取文档,不再出访伺服器。
我的经验,如果可能,尽可能遵循此原则给动态文档添加过期时间,这样可以大幅度增加使用者对伺服器资源的重复出访。
2)将css和js文档放到独立外部文档中引用
将css和js文档放到独立文档中,这样它们会被单独内存起来,在出访其他页面时可以从应用流程的高速内存中直接读取。许多中文网站的首页可能是例外的,这些首页的自身浏览可能并不大,但却是使用者出访中文网站的第一印象以及导向到其他页面的起点,也可能这些页面本身采用了大量的ajax局部刷新及技术,这时可以将 css和js文档直接写在页面中。
3)去掉重复的脚本
在IE中,包含重复的js脚本会导致应用流程的内存不被采用,仔细检查呵呵你的流程,去掉重复引用的脚本应该不是一件很难的事情。
4)避免重定向的发生
除了在header中人为的重定向之外,页面重定向常在不经意间发生,被重定向的文本将不会采用应用流程的内存。比如使用者在出访http://www.xxx.com,伺服器会通过301转向到http://www.xxx.com/,在后面加了两个“/”。如果伺服器的实用性不好,这也会给伺服器带来额外的负担。通过实用性apache的 alias或采用mod_rewrite模块等方式,可以避免无谓的重定向。
还有许多,比如采用CDN分发机制、避免CSS表达式等、避免采用ETags等,因为不太常用,这里就不再赘述了。
做完了上述的强化,可以试着用yslow测试呵呵页面的操控性评分,一般都可以达到70分以上了。
当然,除了应用流程后端和动态文本的强化之外,还有针对程序脚本、伺服器、数据库、负载的强化,这些更深层次的强化方式对技术有更高的要求。责任编辑的后半部分将重点探讨后端强化。
二、后端强化
上次写完web2.0中文网站后端强化篇之后,一直想写写后端强化的方式,今天终于有时间将思路整理了出来。
后端强化可以避免我们造成无谓的伺服器和频宽资源浪费,但随着中文网站出访量的增加,仅靠后端强化已经不能解决所有问题了,后端软件处理并行请求的能力、流程运 行的工作效率、硬件操控性以及系统的可扩展性,将成为影响中文网站操控性和稳定的关键性困局所在。强化系统和流程的操控性可以从以下的方面来入手:
1)apache、mysql等软件的实用性的强化
尽管apache和mysql等软件在加装后采用的默认设置足以使你的中文网站运行起来,但是通过调整mysql和apache的许多系统参数,还是可以追求更高的工作效率和稳定性。这个领域中有很多专业的文章和论坛(比如:http://www.mysqlperformanceblog.com/),要想掌握也需要进行深入的研究和实践,这里就不重点讨论了。
2)应用流程环境加速
这里仅以我最常应用的php开发环境为例,有许多辅助工具软件可以通过强化PHP运行环境来达到提速的目的,其基本原理大致是将PHP代码预编译并内存起来,而不需要改变任何代码,所以比较简单,可以将php的运行工作效率提升50%以上。比较常用的免费php加速辅助工具有:APC( http: //http://pecl.php.net/package-info.php?package=APC)、Turck MMCache(http://turck-mmcache.sourceforge.net)、php accelebrator(http://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和http://Craigslist.org等知名中文网站应用中都得到了检验。
6)伺服器运行状态的检测,找到影响操控性的困局所在
系统强化没有一劳永逸的方式,需要通过检测伺服器的运行状态来及时发现影响操控性的困局,以及可能存在的潜在问题,因为中文网站的操控性,永远取决于木桶中的短板。可以编写许多脚本来检测web服务的运行,也有许多开源的软件也提供了很好的功能
7)良好的扩展构架是稳定和操控性的基础
许多基本功和窍门可以帮你度过眼前的难关,但要想使中文网站具备应付大规模出访的能力,则需要从系统构架上进行彻底的规划,好在很多前人无私的把他们构架
中文网站的经验撷取给我们,使我们可以少走甚多弯路。我最近读到的两篇有启发的文章:
– 从LiveJournal后台发展看大规模中文网站操控性强化方式
– Myspace的六次重构
最后不得不提到流程编码和数据库结构对操控性的影响,一系列糟糕的循环语句,两个不合理的查询语句、一张设计不佳的数据表或索引表,都足以会使应用流程运行的速度成倍的降低。培养全局思考的能力,养成良好的编程习惯,并对数据库运行机制有所了解,是提高编程质量的基础。