网站静态化(转)

  找了部分有关网站静态化的章,分享一下。

网友方案一:

  举行程序也召开了将近4年时间了,从来没有作了啊技术性的稿子,今天发一个只有在大家并联手学习进步,如产生不当地方要指正。 
 
最近好做了一个举行网络广告的网站为全总商机平台的
项目,由于网站首页上板块划分很多,不同板块的数据库查询办法不同,首页内容量巨大,如果仍一般的动态jsp页面的说话那数据库查询将凡宏伟的开支,会
导致首页访问速度的低落。于是考虑以是首页全部静态化。参考地址:http://www.31pt.com/。首页的速度是非常快的。 
  整个网站才故struts2 + spring + hibernate + freemarker +
urlrewrite完成。首页纯静态化,频道与另外页面通过urlrewrite伪静态。现在废话少说。我事先被闹首页jsp
body源代码: 

Java code













尽网站首页的主导构造是通过jsp的include标签将有所通过freemarker生成的静态页面组织起。后台控制各个组成部分的静态页生成。这样做
将首页进行了拆分,便受了静态页面的保护,当我们需要转变“友情链接”部分的时节就是单变动友情链接部分,而无欲拿一切页面都打新兴成一不好。 
  以下是自个儿别静态页最中心的章程,使用freemarker。 

Java code
/**

* 生成静态页面主方法
* @param context ServletContext
* @param data 一个Map的数据结果集
* @param templatePath ftl模版路径
* @param targetHtmlPath 生成静态页面的路径
*/
public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){
Configuration freemarkerCfg = new Configuration();
//加载模版
        freemarkerCfg.setServletContextForTemplateLoading(context, "/");
freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
try {
//指定模版路径
            Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");
template.setEncoding("UTF-8");
//静态页面路径
            String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;
File htmlFile = new File(htmlPath);
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
//处理模版  
            template.process(data, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}

实际上挺简单,只要Google一下就出诸多这面的代码。我哉是Google的代码然后自己再次冲实际情况修改。简单说明一下参数: 
ServletContext :这个不要说了吧。做java
web的应当还亮,只不过struts2备受这样获取ServletActionContext.getServletContext() 
Map <String,Object> data :
模版的数据出自。freemarker通过一个Map给ftl模版送数据。 
如今早已友情链接为列子详细介绍静态页面怎么转移。其他模块以此类推。 
String templatePath :
ftl所当的门路。我这边相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 
String targetHtmlPath :
最后生成静态页的不二法门:我此相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 

友情链接根据这段代码 <jsp:include page=”/html/index_link.html”
flush=”true”>
</jsp:include>我们得freemarker生成一个index_link.html文件。友情链接数据来通过数据库查询得到
取。 
然后还写一个主意专门生成友情链接静态页面: 

Java code
/**

* 生成友情链接的静态页index_link.html
* @param context
* @param data
*/
public static void createIndexFriendLink(ServletContext context,Map<String,Object> data){
crateHTML(context,data,"index_link.ftl","index_link.html");
}

这措施调用上面的createHTML方法。 
下一场因上述措施我们虽好还Struts2底action里面由数据库查询数据放入map调用createIndexFriendLink()方法变静态页了。 
当时是action中的一个主意: 

Java code
/**

* 生成友情链接静态页index_link.html
* @return
*/
public String createLink(){
//权限验证
 if(! this.isAccess())
return "error";
try{
//得到友情链接
            List links = friendLinkDAO.findAll();
//准备数据
            HashMap<String,Object> data = new HashMap<String,Object>();
data.put("links", links);
//调用静态页面方法
            HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);
addActionMessage("静态页面生成成功!");
return "message";
}catch(Exception e){
e.printStackTrace();
return "failure";
}
}

List links = friendLinkDAO.findAll();通过spring注入action的hiberate
DAO获取数据给list然后透过以下代码 
HashMap <String,Object> data = new HashMap
<String,Object>(); 
data.put(“links”, links); 
备数据调用createIndexFriendLink()方法。 
以下是:ftl模版源码: 

Java code
<#if links?size != 0>

<#else>

这么友情链接静态页就生成了。然后另外静态页依此葫芦画瓢。 

总:虽然静态页访问速度快和其他的利,但贯彻起来到底还是大辛苦了,维护也是一个麻烦事情。如果你的站点更新快快那么即便用在公的后台数据更新部分
调用相应的createHTML方法实时的转移静态页面。如果更新快不慢可以以后台手动更新或者以操作系统的定时任务功能去履行你的静态页面生成程
序。www.361pt.com这个网站本身是才故了马上半种植方式。

网友方案二:


知道为什么来头,当系统的访问量达到了8000IP的时刻,tomcat的内存总是会莫名其妙的加及上限,而且到结尾垃圾回收啊会见大艰难,最后造成
系统已响应,我调试了各种参数,包括垃圾回收策略,并行回收,修改各内存配置的参数,结果还同,没道,绝对对立即同样访问量最特别的局部进行总体静态化。

平、静态化要考虑三独点的事情,

1 对SEO

 
能够让寻找引擎更便于之进展信息征集和分类,提升其速以及准确性

2 对用户

 
不克影响版面的亮,不可知以速度影响了优美和可用性

3 对维护

 
一些情节好一本万利的转移,比如菜单调整,连接调整,广告位之调动等

其次、最终使了之类的方案展开

1
使用freemarker进行静态化

2
将菜单,广告位等之后或者转变的地方,使用JS进行操作。
一些地方用多只连的JS,方便以后进行完全调。

3 通过urlrewrite
将访问转到静态化后的页面

4
通过404之错误处理,对从未静态化的页面进行处理

5
静态化时,考虑到帖子量在百万级别,为了以防万一一个文本夹下面有极端多文件,决定依据帖子编号的末尾2员数字进行文件夹分组,比如12345
则分配至 45及时个子文件夹里面,67890
则分配至90是文件夹里面。这样就算拿帖子近似均分到100个文件夹,每个文件夹的帖子在1万单,还得领。如果之后帖子再度多,我便再考虑分成1000
个文本夹了。这个装置要吧以后的扩容留起后路。

其三、具体操作

1
根据现有帖子页面制作ftl的模版,里面如考虑js的剧本位置。

2
制作批量别的次第,为减轻服务器的压力,以有数据库备份为原本,在该地就就有些帖子的初始化,生成htm文件,然后以静态化好的目整个打包上传播服务器。

3
启动404的拍卖,比较新的帖子一经无让静态化,则是因为是次开展处理

4
帖子管理程序改造,在帖子保存时自动进行静态化

5 启动urlRewrite
其中比较重大之一些是

RewriteRule
^/view-([0-9]*?)([0-9]{2}).htm /laozizhu/$2/$1$2.htm [PT]

内部用帖子编号的结尾2位单独分组出来,作为目录名,如果下帖子多了,可以用最后三各来分组了。只待重转移帖子,然后简单的改是规则即可,前台访问不深受其他影响。

四、效果:

脚下网站访问量已达到每日7w的单独IP,tomcat占用内存不超越300M,系统线程数一直在低的丝达。

五、总结

静态化,还是针对大访问量的顶尖方案,不是伪静态化,而是真正的静态化。

网友方案三:

静态化是釜底抽薪减轻网站压力,提高网站访问速度的常用方案,但当强调交互的We2.0 时代,对静态化提出了重胜似之要求,静态不仅要能静,还要积极,下面我透过一个路,谈谈网站静态化后的架构设计方案,同时和豪门探讨一下,在开源产品风行,言架构必称MemberCache, Nginx,的时日,微软技术在网站架构设计中之运用.

静态化的计划基准和手续

静态化是釜底抽薪减轻网站压力,但是静态化也会见带同样名目繁多之问题,包括开及复杂度的增多,维护难度的增多,运用非之当,更或者适得其反,而众多代方案,比如页面缓存,如果以得当,也能够起至死好之功用,所以当始发前,必须进行详细的洞察,确定是否吻合静态化,并制定适合的静态化方式,下面先介绍一下

l         试验读写于:

读写于,准确的乃是读写负荷比,是否值得静态化的末段考虑,由于一般写副的下压力明显高于读出的压力,如果写副太频繁,或者每次写副消耗的资源最为多,都未可知达到效果,我认为读写比例10:1应当是只上限.具体情况需要依据自己的业务逻辑判断

 

l         确定页面呈现的内容是否符合静态化:

在设计方案时,必须详细考虑每个原型页面,找到页面上展示的音,和外的翻新方式,更新会,更新频率,一定要是留意那些不起眼的音讯,他们恐怕左右而的宏图,

据:我们坐CSDN的论坛的即兴一篇帖子为例,进行分析

图片 1

地方的帖子被显现的情要是如此几块,帖子内容,回复内容,发帖人回复人的用户信息

n         帖子内容与回复内容在发帖时更新,发帖后用户可改该情,更新频率高

n         用户信息,用户改个人信息时可能会见发变更,用户等多时为或发生转移,比如加星,更新频率低

n         回复数将每次过来后还如反,更新频率高

n         设计时如果留意细节,如达到图备受围绕出的一对,这些有些是怎修改的,频率有多死,一个且未可知扩过.

l         规定异常成道:

每当点帖子一条例中.每次变更都重新转页面是休可取之,一篇比回复数多的帖子,需要之数据量是惊天动地的(每层楼的用户信息,回复内容),任何改动,都用还取出数据进行转变是勿克容许的.一般只有你的页面基本不用更新,或者更新支出极小,(比如同截嵌入的广告代码)才会用完全创新的艺术,不然就是用我们找到确切的换代页面局部区域的方式:

貌似发生下两只章程:

1)      正则修改法:

        比如,如果帖子中的回复数,html代码是这样

        <label>回复数<var id="replyCount">34</var></label>

        我们可以通过用下面正则来查找并替换计数

         (?<=id="replyCount">)\d{1,}

2)      页面区域分块:

将页面分成多小块,在亮时组装起,比如DotText就采用这方法图片 2

即时是同篇典型的Dottext blog页面,其中红色标定部分是一个独立的文书,而风流框内的是本子动态加载,这些有于最终显示的时段做起来,最终做了相同首Blog,具体的组合方式呢起强,可以利用Include,也足以好来落实.DotText就好实现了一样仿加载机制

 

上面的少种植艺术并无孤立,并得以依据需要,配合以

 

l         规定需要动态加载的信息:

页面上究竟起部分内容看起不绝适合静态化,最典型的凡一对统计结果,比如使您以做一个书籍介绍页面,可能就是会见要出示图书的当天综合评分,或者书籍排名,这些内容需要因此脚论进行动态加载

既然如此做了静态化,就是希望减少服务器负荷,动态加载的数连接不得已而为之,有的时候在需求允许的情况下,我们以数额以实时性和性方面开片服,比如上面帖子中之用户星级以及昵称,从数额实时性上说,当用户之星级增长,他发言的有所帖子还该发生变化,所以理应用动态加载.然而实际上齐这些消息一旦无发生变化,也任危害大雅,用户反而会看到自己以多年前发帖时的级别与昵称.

切实中之品类

X网站是重型的电影资讯,电影社区,向外提供电影系信息服务,以及用户社区,其中信息服务有, 其中绝大多数页面属于信息呈现页,读取量比较异常,百万级别pv,信息要由编辑于后台发布,更新较少,但那个页面及有恢宏的交互性的内容,比如评论,收藏列表,同时广大情允许用户创建,比如上传图片,添加注释.交互内容的多寡及彼此的累程度,都超过了便的咨询页面,这次调整,准备用内部访问量最充分的几乎片:电影资料页,影人资料页,进行静态化,如果成功,还以利用到重多之频段,基本落实全站静态化

 

透过对页面设计和前一版本的分析,下面是怀有挑战性的地方.这些特色基本采用被多数web2.0的站点,很具超人意义

 

l         页面生成的点条件复杂

相似论坛受到的帖子或者blog,更新方式比较单一:主要是出于回复进行接触还有少数底修改动作,然而该网站一个页面上用依据不同点条件虽起20几近只, 比如光二层菜单:用户发布图片,删除图片,发布还是去影片信息,发布或者修改视频,后台修改电影信息,都发生或接触

 

l         一个动作触发生成的页面可能过多并且彼此交叠

各级一个动作都见面硌一多级的变通,并且不同动作可能都见面干与一个页面或者区域的生成.

据:用户被一样步电影评分,需要转移评分更多页,评分统计还多页,首页右侧谁还关注之影片小区域,等等.用户收藏一个影视,也得创新首页右侧谁还关心这影片小区域

 

l         点频繁:

虽低某些还不行局面之网站,但是由于涉及多用户参与的内容,评论,收藏等等,触发点多,发生频度相当频繁

 

l         页面多,结构复杂,空间占据大:

平凡,需要转变的页面规模是这么概括估算的,Rn*P,Rn也资源数,P为每个资源的页面数,所谓资源,可以用作一个转单位,其页面数可以概括看做发布一个资源,就用很成那个独具相关页面数量,比如:发布一个blog,就待非常成一个Blog页,同时还需变更还是更新个人主页的blog列表,算上个人主页右边的归类文章数之微片,也即是极其多10来只页面或者区域,但是发布一个影视,其有关的页面至少有50个以上,而且有页面还带有分页,一个音讯比较丰富的影,其页面还得以高达总单以上,空间10~20M,而且资源总数也非丢掉,电影80000横,电影人尽管P值较少,但是总量确有几十万的巨,估计静态页面磁盘占用量几百个G

 

l         向下兼容

马上是一个既起体系,旧体系的面需要突破,但同时无时间,或者不克全突破,比如Url,已经让用到找寻引擎,就不能够任调,还有一部分地方,原本没有也静态生成考虑,另一些地方还要待相当旧的设计.

 

l         多台前端Web

这种布局要求转变的公文或者得分布到几近个服务器(另一个方案是放在几光专用的机械及,等前端来取)

 

l         职责紧急

搭讨论结束仪式六月新,离奥运开幕上线仅来半点月份,也就是说有根框架实现,页面模板开发,调试测试,动作之整,必须于7月底全部完,按自原本估计,光实现这几片的重重单页面模板与填充方法,也要那么丰富的年月

 

汇总考虑上述要素,架构必须要有以下几单地方的特点

l         动作可活扩展配置,某个动作对应哪些变化,应该可以配备,并且可分组

l         文件要来分发机制

l         分发及转变必须独立出来,并且支持分布式

l         各种的动作,必须换车为信,发送至转与散发服务器进行处理

l         针对同意资源频繁动作,在变量相同的情景下会享有合并之力

l         动作要来记录

l         尽量考虑以都发出成熟技术,节省开支时间

下面是规划的率先单架构

图片 3

用户之动作经过MSMQ[1]传播到变化分发中心(途中绿色箭头)进行处理,,处理中心接受到消息继,负责转对应之页面或者页面区域,并以页面分发到各个服务器,负载均衡沿用以前的架,采用微软的NLB[2]

 

据此用MSMQ,就是看上了他提供的整的音讯存储恢复机制,这样我们会保证即使服务器down掉还开后,消息仍旧能正常处理,碰巧我们cms组的同事MSMQ非常熟悉,并且确实准备在另外一个品种受到以类之架构—于是均等冲撞即合

 

页面下分块存储,这样能保证生成时目标略,开销小,也会重用性,然后再吃由SSI[3](shtml
include)进行整理并,之所以采用这样的方案,而非使Dottext的三结合方式,是以只要采用Dottext的点子,就必移动IIS和.Net的管道[4],而论测试,经过管道和一直返回html性能有坏可怜之出入,而使用ssi,在性质达到是一个折中,并且可Light HTTPd等大性能web服务器

 

模板生成道,采用了XSLT和另外一种植于定义的沙盘(我的同事开发之建制,很有意思, 理论上会管传统模板替换的习性开销全部解),生成的末尾结果是shtml,之所以生成shtml是为了采取那ssi(Server Side Include)的特色,保证一定的灵活性,并促成热点数据的离别:某些页面上的有或会见频繁更新与转变,而别地方不转换,或者有部分凡是具有页面通用的(比如页头和页脚),较之php下常常用smarty,生成php文件,虽然灵活性不苟php,但是性能上无相上下,还稍高.

 

可是这个计划的题材是动态内容和静态内容没有分开,生成的html页面,和动态页面都位于前端服务器上,通过负载均衡访问,也促成了分发服务器需要分发及大半高服务器,网络IO效率较逊色,而且静态内容需之磁盘空间很死,且有些文件特别多,和动态页面混在一起未便宜优化,所以亚独方案对转移的静态内容和动态内容以不同之服务器

 

方案二:

图片 4

俺们管转变的静态文件单独放,可以看,前端增加Nginx,作为跳转,把电影,影人资料库的页面转向静态服务器,其他的调用转向动态服务器,这样咱们尽管好独立为静态服务器进行优化,比如动用重新便捷之服务器等等.

 

并且抽了文本分发的次数(甚至可以只分发到本机),提高转变分发的处理能力

 

更进一步,可以把图片服务分至另外一组机器及,使用独立的域名,比如img.xxx.com,这样可以使得的回落带富

 

末段整架构:

 

图片 5 

文件生成分发中心

下图是文本生成分发中心的劳作流程图

 

图片 6
变迁服务对外只生一个输入,就是信,一个输出:静态文件,内部根据消息,从部署文件中找到相应的变化方法,取出相应的模版,进行数据填充

 

分发服务要吧生成服务产生的文书进行分发,分发至前端的N台服务器上,开始考虑得比较复杂,希望分发服务可超越协议(本地文件系统,局域网,http协议),跨越多种存储介质(文件系统,数据库),实际最后得下来基本是地面文件系统或者局域网传输

 

流动:上图中文件分发的有些也可经定制MogileFS,来落实分布式文件系统

 

马后炮:

小结起来,静态化除了针对架构方面的震慑,对出暨测试流程也闹影响

对测试提出更强之求:

因要是达丝后,某个页面发现题目,即使是文字的修改,也欲再次转许多页面,所以测试人员必须特别细心,测试周期也得延长

 

开发人员需要控制模板语言

亟需控制一栽模板预言,无论是Xslt还是团结开支之沙盘语言,都需花费得的光阴掌握

 

内需让第一蹩脚非常成腾出足够时间:

使未是新系,那么数量迁移和扭转的进程尽管比较痛苦,由于页面众多,第一差变的历程或者得盖天来测算,在制订上线方案是就是需要考虑到是上面

 

Nginx作为前端的跳转,根据外网站的经历,应该好达到2-3万并作连接,但是下以后,常常发生卡的情事有,具体症状呢于浏览器被访问页面时,连接超时,或者直接无应,此时Nginx连接数并无赛,好以还出第一套方案得以备用,让咱出日去解决之问题,如果大家对之题材发生什么经验,欢迎交流

自家之联系方式

MSN:yizhu2000@hotmail.com

Gtalk:yizhu2005@gmail.com

 

篇后:

当大型web开发及,我发微软产品布局(包括微软从头源社区的收获)在一些地方尚存在有的供不应求:

 

强性能服务器选择最好少

Linux下可以以Light HTTPd,Nginx等多服务器,这些服务器在过剩地方的见会为Windows下唯一的挑选–IIS相形见绌

 

分布式文件系统

微软会同社区没比较出名的制品出现,Linux下发出MogileFS

 

微软架构下,文件系统选择最少:

当Linux下我们好选诸如Ext3,ReiserFS,而Windows环境下,NTFS是绝无仅有的挑三拣四,不过值得称赞的凡.NTFS的效率与泰都一定不错.

 

开源技术对windows版本的支撑态度不主动

众在Linux下名声卓著的开源产品,又懒于为Windows提供对应的版,或者提供的windows版本效果不同强人意.使得用微软服务器的厂商少了众挑

 

现行之Web开发都进来了各种技能非常杂,大做的时期,任何一个厂商都非可能带有所有方,在后端架构和逻辑方面.Net和Java严谨,良好的编程风格,清晰的计划思路,较高之运行效率,以及稳定的配套服务支持,是其极可怜之优势,对第一擅长微软技术的Web工程师和绑架构师而言,应该增强对Linux及开源社区的垂询,才能够因要求设计出客观之架

 


[1] Message Queuing: A Scalable, Highly
Available Load-Balancing Solution

http://msdn.microsoft.com/en-us/library/ms811052.aspx

[2] 网络负载平衡(NLB)详解,注意文章后让起底参考链接

http://blog.chinaitlab.com/user1/563173/archives/2007/132713.html

[3] 怎样使用ssi,及其语法:

http://blog.csdn.net/dadou2007/archive/2008/06/08/2521365.aspx

Nginx下的ssimodule

http://www.nginx.cn/NginxChsHttpSsiModule

[4] asp.net的拍卖体制http://www.microsoft.com/china/msdn/library/webservices/asp.net/dnvs05Internals.mspx?mfr=true

html.asp.aspx运行效率比较

http://iamlibai.blogbus.com/logs/2017870.html

网站地图xml地图