前段时间,由于网站mysql数据库性能瓶颈原因,开始研究网站页面静态化。目前已上线并且运行良好,具体的过程和想法贴出来,和大家一起分享一下。
网站: http://v.xxt.cn
静态化的好处:
1.响应速度快,避免中间转换步骤
2.避免与数据库的交互,减轻服务器的压力
3. 对SEO友好,更容易被爬虫抓取。(貌似此处现在没有这个优势了。看百度seo说明上面,动态页面也不存在啥问题。)
适用的地方:
更新不频繁、跟用户个人信息相关性低。
新闻、博客、商品信息等。。。
实现原理:
1. 伪静态化
看上去是静态化,其实还是动态的网页内容。对性能没有任何的提升。主流技术:urlrewrite
2. 全静态化
我们用浏览器访问页面的时候,其实展现给我们的就是html页面,经过服务器处理过的。本次的原理就是利用http请求,获取到服务器生成的html页面的源代码,存起来让用户访问。
在java程序中利用java.net.Url来获取web内容,然后重写html文件。
java.net.Url;
java.net.HttpURLConnection;
java.net.HttpURLConnection;
java.io.File;
httpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行.
说明:
原理很简单,但是在实施的时候,有很多需要注意的地方。
比如
1. 动态的内容,比如首页如何处理用户的登陆?
2.个性化内容,不同的用户如何展现不同的信息?
3. 生成html页面的时候,生成到一半程序挂掉了,如何保证页面正常?
4. 页面有更新怎么办?更新机制有轮询生成和事件触发生成。
5. 以前的老地址怎么办?使用urlrewrite来重定向到新html页面
6. html文件存储怎么办?建立合理的文件存储目录规划
7. 生成的html页面需要进行处理,去除掉空行和空格,可以大大减小html的大小。可达几十K。
8. 在做一些地址转发时,可能会用到id取模计算等,这些urlrewrite是做不到的,可以利用nginx的计算模块lua来实现。
动态处理的内容是无法静态化的。所以需要增加 js+cookie 来控制动态的内容。
参考资料
1.http://tristan-wang.iteye.com/blog/554456
2.http://baike.baidu.com/view/2510440.htm
3.Urlrewrite
http://tuckey.org/urlrewrite/
http://www.jtict.com/blog/seam-form-url-rewriting/
http://www.megadix.it/content/urlrewritefilter-un-modrewrite-le-servlet
http://tuckey.org/urlrewrite/manual/3.0/guide.html
http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#filterparams
http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#condition