« VOS与Windows Server 2003不兼容之解决方法黑莓版Google地图图层误差消失,期待windowsmobile版发布 »
October 26 2008

Windows平台下轻量级门户网站静态化解决方案

PurpleFire @ 11:19

本文主要讨论关于轻量级门户网站静态化的解决方案,所谓轻量级就是指访问量不太大,服务器规模较小的情况,当然没有绝对的界限,仅仅是相对比较而言。高校和中小企业门户网站是很好的案例,但是像新浪、腾讯这种大型门户网站不在讨论范围之内。

一、问题的提出

通常,一个校园网的门户网站群仅由几台(<10)服务器构成,当然很多知名大学的门户网站服务器远不止这个数目,在这里我只是说一般的高校,或者再降低一个层次——一个高校下属的某个学院的主页。我们的门户网站可能集成了多个频道,比如新闻、教学资源、业务(信息)系统以及由电影、音乐、论坛、即时通讯等版块构成的娱乐生活栏目,这些频道可能由来自于不同平台的CMS系统构成,而且你的首页需要调用这些不同频道的最新内容。那么,面对较大的访问量,网站静态化是必须考虑的。

二、需求分析

现在流行的CMS系统/论坛系统一般都提供了首页调用功能,即通过访问一个含有参数的URL链接,返回一个满足需要的内容列表。门户网站的首页比如下面的iWMS官方首页截图,图中画红框的模块其实可能都是调用了某个栏目的最新文章。

点击查看大图

以前我将新闻频道作为一个门户网站的主频道,其他频道作为次要频道,然后通过修改iWMS自己提供的首页模板来构建整个门户首页。由于调用了大量其他系统的内容,导致访问速度较慢,用户体验很差,而且可扩展性比较差,况且有些小系统并没有提供首页调用代码。使用那个模板完全束缚了网站前台设计师,没办法放开手脚做。因此我们放弃了它自己的模板,转而构建我们自己的主页。像腾讯、金融界这种风格的首页越来越普及了,它们采用了多栏目重叠放置,使首页承载的信息量翻了数倍。我们模仿这种风格,将各频道、栏目模块化,这些模块全部采用调用的方式。由于这些调用分散在不同 的服务器,涉及了不同的数据库、Web服务器技术,在门户网站首页进行调用会产生大量的服务器间通信、多次数据库查询以及磁盘I/O操作,因此,将这些调用结果静态化是一个很好的解决办法,毕竟很多人看到的首页大部分内容都是重复的,如果每个人来访问都调用一遍最新数据是对服务器性能极大的浪费。

三、门户网站首页静态化解决方案

1.完善调用代码

即使这些cms系统有些提供了自己的调用,但输出的结果可能并不是我们需要的显示方式,我们还得格式化这些调用结果。

最笨的也是最有效的方法就是自己分析数据库结构,然后随心所欲的写调用代码。因为仅仅是查询数据库的操作,所以这个过程比较简单,只是比较麻烦,要费些工夫。

当然,你也可以直接利用系统自带的调用代码,然后在设计页面时利用强大的正则表达式对它们进行格式化。

2.执行调用并将生成的结果静态化

当我们通过某些随机或周期事件触发调用代码,得到了结果,接下来应该把它们静态化。

一种方法就是调用完毕即生成一个文件(脚本/或纯文本形式),让首页可以include这些文件。这样做的好处是文件一旦生成就不会消失,除非新的调用将其覆盖。坏处就是对磁盘频繁读写,造成cpu等资源占用升高,影响了效率。

另一种方法就是将结果写入服务器内存,在ASP中可以写入Application变量,在ASP.Net中淡化了Application变量,当然你一样可以使用它,也可以使用cache类,这里不讨论。这样做极大的提高了访问速度,缺点就是由于Application变量不宜存储大量数据,比如图片什么的,还有就是Application变量依赖于服务器的进程,默认2小时空闲进程就会被IIS6回收。因此,如果你不想让用户看到你的页面中调用的部分是空白内容,你就要调整IIS的设置,让工作进程的生存周期变长。

当然只是将首页频繁调用的内容写入内存,而文章的内容页还是写到文件比较好。毕竟内存是有限的,而首页调用的内容访问频率较高且不算太大,所以放入内存。

3.如何调用&什么时候触发调用?

如何调用?

我想说的不是传统的调用方式,那样大家都会,这里我来探讨一下如何使用服务端ajax进行调用。

为什么要使用服务端Ajax进行调用呢?呵呵,其实这样做的目的就是集成多个调用于一体,通过参数更好地控制各个调用模块,让它更好的为触发服务,不然分散开来调用太麻烦。我们为这个集中调用程序起个名,叫“更新缓存”页面。

什么时候调用?

——更新完新闻、软件、音乐,etc,退出管理时跳到更新缓存页面。

——客户端第一次访问时在后台(比如将更新缓存页面放入一个0高度的iframe中)进行调用。

——显示不正常时,可以直接访问更新缓存页面。

这里给出我的示例代码(点此下载),欢迎探讨。

四、后记

通过上面的解决方案,门户主页的访问速度已经很快了,承载的访问量可以提高2到10个数量级。至于网站内容页面的静态化,直接采用文件型静态化方案就行了,一般的CMS系统均有此功能。

另外,由于高校或企业内部一般都是局域网或高速城域网,页面几乎没有延迟,影响速度的只有浏览器的解析和渲染速度了。因此,还有一件事情就是要使首页应付现在多种浏览器共存的局面,这里不再赘述。

本文只是讨论中小型门户站在Windows平台下的静态化解决方案,对于大型网站来说,负载均衡和缓存加速必不可少,您可以参考车东的博客:基于反相代理的Web缓存加速——可缓存的CMS系统设计

收藏

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。