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系统设计

July 4 2008

关于SQL语句各子句的优先级问题

PurpleFire @ 15:21

近日,单位的网站新闻系统(Asp+Access)突然出了个小毛病,具体现象如下:在网站首页调用了最新的十篇新闻,但是具体显示出来却是超过了十条,达到十四五条。我查看了一下源代码,SQL语句明明是"Select Top 10 ..."可是选出来的结果不止十条,百思不得其解。

我首先怀疑新闻标题中有非法字符,导致Select语句执行错误,也确实存在一些字符,含有“&”符号,这个符号可能跟Request.QueryString得到的值冲突,我将其改成正常字符,再去执行,现象依然。

我进入数据库(Access),将查询字符串放入数据库中执行,对比查询出来的记录,终于找出了原因。原来是SQL语句中加了“Order by dateandtime desc”子句,查询出来的结果,前八条时 间都不相同,但是后面六条时间却是相同的。因此Top 10子句不知道该如何取舍,于是把那六条都取出来了,就好比,一个班的学生考试成绩排名,除前两名外,有三个人并列第三名,你要取前三名就得取五个人,这 是一个道理,Top 10并没有限死在十条记录,而是取出了最接近十条记录的结果。由此得出结论,Order by子句优先级高于Top XXX子句,后来查询标准T-SQL语法也是如此。看来,有些东西还得细细研究一下。

另一个解决方案,就是在显示的时候在循环里计数,超过十条就跳出循环。之前我用的“While ...Wend”循环,该循环没有跳出语句(除非你用goto,不提倡),所以现在需要修改为“do while ... loop”,跳出语句可以采用“exit do”。

June 16 2008

为你的Feeds加上版权(For最新的Zblog1.8Spirit)

PurpleFire @ 22:46

代号为"Spirit"的最新的Zblog 1.8版本在6月初发布了,Build号为80605.

像往常一样,下班后第一件事是打开Google Reader看看大家的Feeds,发现"幸福收藏夹"老兄的博客最近更新迅速,有很多有用的东西,不过都是关于WordPress的.他的Feeds输出带有版权信息.于是我也着手开始改造我的Zblog.没太仔细研究,我打算直接对代码进行hack.方法如下:

打开你的Function目录中的c_system_base.asp文件,搜索"For i=1 to ZC_RSS2_COUNT"(大约在2422行,ExportRss()函数里面),在它后面加上下面两个自定义变量,这两个变量是在原来的摘要或者正文后面加上了自己的版权信息.

     Dim HtmlIntroWithCopyright,HtmlContentWithCopyright
     HtmlIntroWithCopyright = CStr(objRS("log_Intro")) & "<hr />©2008 <a href='http://www.fireblog.cn/' target='_blank' closure_hashcode_='169'>紫焰的博客</a>.   版权所有,转载务必注明.该Feed只供个人使用,禁止未注明的转载或商业应用.非法应用的,一切法律后果自负.如有问题,可发E-mail至liming.xd@gmail.com.<hr />"
     HtmlContentWithCopyright = CStr(objRS("log_Content")) & "<hr />©2008 <a href='http://www.fireblog.cn/' target='_blank' closure_hashcode_='169'>紫焰的博客</a>.   版权所有,转载务必注明.该Feed只供个人使用,禁止未注明的转载或商业应用.非法应用的,一切法律后果自负.如有问题,可发E-mail至liming.xd@gmail.com.<hr />"

然后将下面的objArticle.LoadInfoByArray函数里面的两个参数objRS("log_Intro")和objRS("log_Content")分别换成上面的两个变量HtmlIntroWithCopyright和HtmlContentWithCopyright就行了.

修改完的代码文件如下,有需要的朋友可以查看第2422行以下部分. 

c_system_base.rar

March 24 2008

可以防范SQL注入的ASP代码两例

PurpleFire @ 19:54

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。SQL注入的手法相当灵活,在注入的时候需要根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据.

   SQL注入攻击的总体思路是:

   1. 发现SQL注入位置;

   2. 判断后台数据库类型;

   3. 确定XP_CMDSHELL可执行情况

   4. 发现WEB虚拟目录

   5. 上传ASP木马;

   6. 得到管理员权限;

……

为了防止注入攻击,最基本的方法是进行关键字过滤,现在推荐两种典型代码,可以全局调用或加在每个动态网页之中.

……

December 7 2007

被Javascript及CSS的大小写郁闷了

PurpleFire @ 19:39
前几天比较忙,这两天在抓紧时间赶制Zblog的圣诞节主题。在移植过程中,我给该主题增加了调节正文大小的功能,这在常见的CMS系统(如动易、IWMS等)中都有,原理就是用Javascript控制DIV层的CSS效果。
分页:«12»