中小网站静态化目录结构设计
发表于:2010-08-07 | 零回复

  大型网站每天的访问量是惊人的,比如淘宝网每日独立IP超4000万。对于一些中小型的网站来说,虽然每日独立IP不会如此巨大,但若不对网站程序进行优化,也将会导致访问的速度。

  目前很多网站都会进行静态化从而解决服务器的压力,也有一些网站采取了缓存的方式,有实力的企业在这两种基础之上增加服务器集群。我们今天想要探讨的并不是缓存,也不是集群,更不是如何静态化页面,而是如何设计静态化页面的目录结构。

  举个例子,比如博客类网站,这种网站每天都会有很多用户注册,也会有很多用户发表日志。一般我们会在用户点击发表日志后对该日志进行静态化,生成 html 文件。这时问题来了,生成的 html 文件放在什么地方?先来回顾一下访问 web 上的 html 文件的方法。比如 mypage.html 这样一个 html 文件,放在 web 的根目录(以 mxjava 为例),访问时要在地址栏中输入 http://www.mxjava.com/mypage.html 。将该文件转移到 blog 目录下后,访问时就要变成 http://www.mxjava.com/blog/mypage.html 。也就是说 url 是按照目录结构进行访问的。回到刚才的博客程序,为了能让访问者能够访问到刚才生成的 html 文件,我们可以把该文件放在网站的根目录,这时访问者只要输入网站 url + html 文件名就可以浏览这个文件了。这样做虽然简单,但有很多问题,比如所有的 html 放在同一个目录下会导致文件“爆炸”,对文件的管理困难,url 中没有用户的博客地址信息可能会让用户离你而去等。问题很多,最直接的解决方案是为每位注册用户建立一个目录,将用户的 html 文件保存到对应的目录中。这时访问时 url 将变成 http://www.mxjava.com/用户名/mypage.html。url 中出现了用户博客信息也解决了文件放在同一目录下的尴尬。这样的解决方案看起来不错,但问题仍然存在,假设该网站每天会注册一百个用户,十天就一千个,一百天就一万个。将这一万个目录都放在网站根目录下看上去也很可怕,况且日子一天一天过,用户还在增加,目录也在增加……由于目录数量的庞大,也许不久后,网站会崩溃,系统也会瘫痪。

  那么该如何解决这个问题呢?首先可以用日期来做为目录,如:root/2010/08/07/。然后将所有用户同一天发布的文章保存的同一天的目录中,文件名为用户id + 文章id的形式(用户id+文章id的形式可以解决不同用户访问同一文件的问题)。接下来要解决的是用户访问的问题,由于直接访问 html 文件的 url 是以目录结构来设定的,要直接访问的话就会出现上面的问题。那么将控制访问文件的权限从用户那里转移到程序来。以 struts2 为例,http://www.mxjava.com/blog.do?uid=hiswing&id=20100807100 这个 url 将访问 blogAction ,在这个 Action 中解析 url ,将解析好的 url 保存在 request 中。如下:

String uid = request.getParameter("uid"); 
String id = request.getParameter("id"); 
String year = id.substring(0, 4); 
String month = id.substring(4, 6); 
String day = id.substring(6, 8); 
String aid = id.substring(8);

在 struts.xml 文件中配置 result 为 /${year}/${month}/${day}/${uid}${aid}.html,这样解析后的 url 就变成 /2010/08/07/hiswing100.html

  关于性能:直接访问 html 速度肯定比用上面的方法要稍微快一些,不过真正的性能瓶颈并不在应用,大部分都在数据库访问。况且程序只是处理一下 url 性能的影响可以忽略不计。
  关于目录结构:以日期为单位,100年也只有100个年目录,每年下面有12个月目录,每月下面最多31个日目录,每天用户也许不会超过2000篇文章,若超过2000篇文章,那就恭喜您了,您要发达了。
  关于url 的友好度:struts2 可以自由控制后缀,但参数还是要用 get 的方式传的。若觉得这种 url 不友好,那么可以使用 UrlRewrite 来解决这个问题。关于 UrlRewrite 的介绍网站有太多文章了,我们就不多说了。不过在下一篇日志中我们将介绍如何用改造 UrlRewrite 来满足我们不同的需求--自定义 url 解析方法。

评论留言