网页优化 (转小叶)

一说到网站访问速度,很多人首先想到的是网络带宽和服务器的配置,但很多时候网站的设计与架构也是影响访问速度的重要因素。为了提高网站的访问速度,你不妨试试下面的优化技巧。

1、将数据操作移到数据库服务器
        对于采用Sql Server+Asp.NET这样架构的网站可以把部分数据操作从Web服务器移植到数据库服务器中来,因为对于一个网站来说,70%左右的负荷都是由Web服务器来承担的,这样的移植不但减轻了Web服务器的压力,也提高了数据库服务器的使用效率。存储过程可以很好的实现这种转移,把常用的查询、添加与修改封装成独立的存储过程存入数据库中,需要时直接调用,在保证效率的同时,也提高了数据访问的安全性。

2、将逻辑移到客户端
        这其实也是一种减轻web服务器负荷的方式,把能用javascript实现的逻辑都放到客户端来,减少了服务器端的运算,可以有效地提高访问速度。

3、用Ajax提高用户体验
        Ajax的一个很大的优势就是服务器只向用户发送需要更新的数据,即使在带宽不是很好的情况下也保证足够好的用户体验,对带宽资源也是一种很好的节约。

4、使用连接池
        使用连接池的好处我就不多说了,相信不少朋友都有这方面的体会,有兴趣的话可以参考一下msdn上的这篇文章。http://msdn2.microsoft.com/zh-cn/library/8xx3tyca(VS.80).aspx

5、使用页面缓存技术
        页面输出缓存将已经生成的页面保存在服务器中,当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期。在这个过程中,缓存不再需要经过页面处理生命周期,缩短了请求响应时间,提高了应用程序性能。页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面。

6、使用gzip压缩页面

一. HTTP压缩概述

HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如gzip等压缩HTML、JavaScript或CSS文件。压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度。当然,同时也会增加一点点服务器的负担。Gzip是比较常见的一种HTTP压缩算法。

本文介绍的HTTP压缩方式,采用的是Windows系统设置的方式,优点是效率较高。


二. HTTP压缩工作原理

Web服务器处理HTTP压缩的工作原理如下:

Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩;
如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
如果请求文件是ASPX等动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。


三. IIS 6.0中配置HTTP Gzip压缩的步骤:

1) 打开Internet信息服务(IIS)管理器,右击"网站"->"属性",选择"服务"。在"HTTP压缩"框中选中"压缩应用程序文件"和"压缩静态文件",按需要设置"临时目录"和"临时目录的最大限制";

2) 在Internet信息服务(IIS)管理器,右击"Web服务扩展"->"增加一个新的Web服务扩展...",在"新建Web服务扩展"框中输入扩展名"HTTPCompression",添加"要求的文件"为C:\WINDOWS\system32\inetsrv\gzip.dll,其中Windows系统目录根据您的安装可能有所不同,选中"设置扩展状态为允许";

3) 使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml(建议先备份),找到Location ="/LM/W3SVC/Filters/Compression/gzip",如果需要压缩动态文件,则将HcDoDynamicCompression设置为"TRUE",并在HcScriptFileExtensions中增加您要压缩的动态文件后缀名,如aspx;如果需要压缩静态文件,则将HcDoStaticCompression和HcDoOnDemandCompression设置为"TRUE",并在HcFileExtensions中增加您需要压缩的静态文件后缀名,如xml、css等;HcDynamicCompressionLevel和HcOnDemandCompLevel表示需要的压缩率,数字越小压缩率越低;

4) 编辑完毕后保存MetaBase.xml文件;如果文件无法保存,则可能IIS正在使用该文件。打开"开始"->"管理工具"->"服务",停止"IIS Admin Service"后,即可保存;

5) 最后,重新启动IIS。可以到HTTP压缩测试网站验证结果。



关于gzip压缩页面的问题
思路:用ServerXMLHTTP组件下载页面,保存为*.zip文件,解压文件,读取文件
代码(JScript格式)

function getGzipPage(url){
     //Gzip格式页面采集程序
     //by fisker (http://ifisker.com lionkay@gmail.com)
     var fileStream;
     var xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP");
     xmlHttp.open("GET",url,false);
     xmlHttp.send(null);
     fileStream=xmlHttp.responseBody;
     delete xmlHttp;
     var objStream = Server.CreateObject("ADOD"+"B.Stream");
     objStream.Type = 1;
     objStream.Open();
     objStream.write(fileStream);
     objStream.SaveToFile(Server.MapPath("tmp.html.zip"),2);
     objStream.Flush();
     objStream.Close();
     delete objStream;
     unZip("tmp.html.zip");
     var str=ReadFile("tmp.html");//ReadFile,deleteFile就是简单的文本读取和文件删除函数,未附代码
     deleteFile("tmp.html.zip");
     deleteFile("tmp.html");
     return str;
}



由于winrar的命令行工具不支持zip格式的文件,所以我选择了7z的命令行工具7za.exe,在百度搜索下就可以找到
在使用下面的代码前把cmd.exe(windows文件夹下有)和7za.exe拷贝到asp程序目录

代码(JScript格式)
时间关系,并没有写更多的容错以及返回值问题

function unZip(file){
     //在线解压zip函数
     //by fisker (http://ifisker.com lionkay@gmail.com)
     var objFso=Server.CreateObject("scripting.FileSystemObject");
     var objWshShell=Server.CreateObject("Wscript.Shell");
     var zipFile=Server.MapPath(file);
     if(!objFso.FileExists(zipFile)) return false;
     var runcmd=Server.MapPath("cmd.exe")+" /c "+Server.MapPath("7za.exe")+" x "+zipFile+" -y -o"+Server.MapPath("./");
     var RetCode = objWshShell.Run(runcmd,1,true);
     if(RetCode!=0)return false;
     delete objWshShell;
     delete objFso;
}











针对目前搜索引擎进行网站优化的精华要点。
  1、尽量以<HTML>作为代码的开始端,并模块化javascript和CSS,尽量使用include使之 独立与HTML页面。
  2、如果网站内容的访问需要会员登陆或者有密码保护,请开放给搜索引擎的Spider或者Robot。
  3、如果网站的内容是用PHP,ASP或者JSP等script动态生成的,需要通过Apache的Mod_Rewrite 或PHP的Path_Info进行URL重写 和优化,以便做成类似静态页面的URL。如:可以把http://www.domain.com/article?id=123&cat=abc映射成为http://www.domain.com/a rticle/123/abc或http://www.domain.com/article_123_abc.htm。
  4、尽量避免不必要的跳转和重定向页面或会产生3xx的类似机制。
  5、保持HTML中<title>标签中的内容与真实文章或内容的标题保持一致,并尽量做到每个页面的唯一性 。
  6、使用<H1>和<H2>标签来表示真实文章或内容的标题和副标题,如果为了保持美观,请使用C SS进行定义。
  7、尽量保持每个<IMG>标签中有ALT属性,而且最好所有的ALT属性都有内容。
  8、建立一个结构清晰和有意义的网站导航页面。
  9、在网站的根目录建立一个robot.txt文件,如果对搜索引擎没有任何特殊要求,则内容为*;或者加入对搜索引擎要求 的一些script。
  10、尽量不要使用frame结构来呈现网站。
  11、尽量使网站的代码符合W3C的HTML 4.0或XHTML 1.0规范。
  12、对网站比较主要的内容或学术文章,尽量转换成PDF格式。因为PDF格式的文件天生的Page Rank就是3。
  13、尽量使网站的结构趋向于扁平化,最好不要超过3层。









网站优化:就是根据搜索引擎自然排名特点,让网站设计的更符合搜索引擎的排名原则,让搜索引擎友好,从而获得搜索引擎收录并在检索结果中排名靠前。META标签是基础面向搜索引擎的语言,帮助搜索引擎蜘蛛更好的划分类别,然后在调节页面的关键词密度,制作简便的网站检索地图,即sitemap.xml、sitemap.html),让搜索引擎蜘蛛更好的抓取网站的页面,等是常用的优化方式之一。

      一、网页关键词密度

      即:每页可以放置优化的关键词与关键词的链接.

      二、META标签设计方法:

      HTML标签是对网站内容的概括,方便搜索引擎划分网站的分类,词与词的分类,可以有利于搜索的自然排名,META标签一般都放于定义,起到的作用是本站主要做什么的,就像面对搜索蜘蛛的第一印象一样,在优化时很重要,要注意以下几个要点:

      1、标题上有创新性,当搜索蜘蛛来临时,发现内容很新颖,数据库内没有别的相同数据,你的网站会更讨搜索喜欢。

      2、全站尽量做到标题不要相同,不同的页面显示不但起不不一样的作用,更起到不同的名字,便于搜索更好的的划分分页内容。

      四、关键词的选择

      1、不一样是热的关键词才最好,而是适合你网站的才最好,热门的词不但不利于提升搜索排名,而且有可能会被搜索降权,拔毛的危险。

      2、词不要太多,最多请放三个为宜,举例,一个瓜,你三个人可能吃饱,但要是三十个人一起吃,就只能尝尝,同样搜索也是这个道理,词放的少更有利排名,词放的多,反而更扩大话了,更不利于排名的提升。

      五、网站的内容要点

      1、部分主要图片有文字说明(alt="")定义,如logo等。

      2、内容尽量别用采集,原创,即使采集也要做相应的编辑修改

      3、突出主题,把网站的关键词,标题等可能采用加粗等加强定义,让搜索蜘蛛知道网站的主题关键是什么

      4、增加关词的超连接,内页链接着分频道标题,频道链接着内页标题,内容相互呼应,有当前网页位置导航,更好的让搜索蜘蛛索取内容。在把网站的内容转载到比较大,搜索常去的地方,更好提高权重。

      六、防收被搜索引擎判断为作弊的方法

      1、不要在标题中出现非法内容

      2、不要放置与网页内容不相关的关键词

      3、关键词的不要堆砌过多

      4、内容充分,不要有标题,内容却很少或没有的情况。





提升JSP页面响应速度的七大秘籍绝招

方法一:在servlet的init()方法中缓存数据  当应用服务器初始化servlet实例之后,为客户端请求提供服务之前,它会调用这个servlet的init()方法。在一个servlet的生命周期中,init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作,就可大大地提高系统性能。
  例如,通过在init()方法中建立一个JDBC连接池是一个最佳例子,假设我们是用class="t_tag">jdbc2.0的DataSource接口来取得数据库连接,在通常的情况下,我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQL请求都要执行一次JNDI查询的话,那系统性能将会急剧下降。解决方法是如下代码,它通过缓存DataSource,使得下一次SQL调用时仍然可以继续利用它:
以下是引用片段:
public class ControllerServlet extends HttpServlet{
private javax.sql.DataSource testDS = null;  
public void init(ServletConfig config) throws ServletException {
super.init(config);   
Context ctx = null;  
try{    
ctx = new InitialContext();   
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}catch(NamingException ne){ne.printStackTrace();}
}catch(Exception e){e.printStackTrace();}
} 
public javax.sql.DataSource getTestDS(){ 
 return testDS; 
} 
...
...  
}

  方法 2:禁止servlet和JSP 自动重载(auto-reloading)
  Servlet/JSP提供了一个实用的技术,即自动重载技术,它为开发人员提供了一个好的开发环境,当你改变servlet和JSP页面后而不必重启应用服务器。然而,这种技术在产品运行阶段对系统的资源是一个极大的损耗,因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。
  方法 3: 不要滥用HttpSession
  在很多应用中,我们的程序需要保持客户端的状态,以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性,从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中,是通过HttpSession对像来实现session的功能的,但在方便的同时,它也给系统带来了不小的负担。因为每当你获得或更新session时,系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能。
  如果没有必要,就应该关闭JSP页面中对HttpSession的缺省设置。 如果你没有明确指定的话,每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话,那可以通过如下的JSP页面指示符来禁止它:
以下是引用片段:
<%@ page session="false"%>

  不要在HttpSession中存放大的数据对像:如果你在HttpSession中存放大的数据对像的话,每当对它进行读写时,应用服务器都将对其进行序列化,从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大,那系统的性能就下降得越快。
  当你不需要HttpSession时,尽快地释放它:当你不再需要session时,你可以通过调用HttpSession.invalidate()方法来释放它。尽量将session的超时时间设得短一点:在JSP应用服务器中,有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话,系统会将相关的session自动从内存中释放。超时时间设得越大,系统的性能就会越低,因此最好的方法就是尽量使得它的值保持在一个较低的水平.
方法 4: 将页面输出进行压缩
  压缩是解决数据冗余的一个好的方法,特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩,这种方法可以戏剧性地减少HTML文件的下载时间。因此,如果你将servlet或JSP页面生成的HTML页面进行压缩的话,那用户就会觉得页面浏览速度会非常快。但不幸的是,不是所有的浏览器都支持gzip压缩,但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段:
以下是引用片段:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
OutputStream out = null;
String encoding = request.getHeader("Accept-Encoding");  
if (encoding != null && encoding.indexOf("gzip") != -1){
request.setHeader("Content-Encoding" , "gzip");  
out = new GZIPOutputStream(request.getOutputStream());
} 
else if (encoding != null && encoding.indexOf("comdivss") != -1){
request.setHeader("Content-Encoding" , "comdivss");  
out = new ZIPOutputStream(request.getOutputStream());
}else{  
out = request.getOutputStream();
} 
... 
...  
}
  方法 5: 使用线程池
  应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理,并为它们分派service()方法,当service()方法调用完成后,与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源,这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。
  另外,我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时,它会创建数量等于最小线程数的一个线程池,当客户有请求时,相应地从池从取出一个线程来进行处理,当处理完成后,再将线程重新放入到池中。如果池中的线程不够地话,系统会自动地增加池中线程的数量,但总量不能超过最大线程数。通过使用线程池,当客户端请求急剧增加时,系统的负载就会呈现的平滑的上升曲线,从而提高的系统的可伸缩性。
  方法 6: 选择正确的页面包含机制
  在JSP中有两种方法可以用来包含另一个页面:
  1、使用include指示符
以下是引用片段:
<%@ includee file=”test.jsp” %>

  2、使用jsp指示符
以下是引用片段:
<jsp:includee page=”test.jsp” flush=”true”/>

  在实际中发现,如果使用第一种方法的话,可以使得系统性能更高。
  方法 7:正确地确定javabean的生命周期
  JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用jsp:useBean标签,可以将javabean直接插入到一个JSP页面中。它的使用方法如下:
以下是引用片段:
<jsp:useBean id="name" scope="page|request|session|application"  
class="package.className" type="typeName">
</jsp:useBean>

  其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话,它将影响系统的性能。
  举例来说,如果你只想在一次请求中使用某个bean,但你却将这个bean的生命周期设置成了session,那当这次请求结束后,这个bean将仍然保留在内存中,除非session超时或用户关闭浏览器。这样会耗费一定的内存,并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期,并在bean的使命结束后尽快地清理它们,会使用系统性能有一个提高。
  其它一些有用的方法
  1、在字符串连接操作中尽量不使用“+”操作符:在java编程中,我们常常使用“+”操作符来将几个字符串连接起来,但你或许从来没有想到过它居然会对系统性能造成影响吧?由于字符串是常量,因此JVM会产生一些临时的对像。你使用的“+”越多,生成的临时对像就越多,这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“+”操作符。
  2、避免使用System.out.println()方法:由于System.out.println()是一种同步调用,即在调用它时,磁盘I/O操作必须等待它的完成,因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具,为了解决这个矛盾,我建议你最好使用Log4j工具(http://Jakarta.apache.org ),它既可以方便调试,而不会产生System.out.println()这样的方法。
  3、ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销,因为它将所有的原始输出都转换为字符流来输出,因此如果使用它来作为页面输出的话,系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题,但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。
  总结
  本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能,并因此提升整个J2EE应用的性能。通过这些调优技术,你可以发现其实并不是某种技术平台(比如J2EE和.NET之争)决定了你的应用程序的性能,重要是你要对这种平台有一个较为深入的了解,这样你才能从根本上对自己的应用程序做一个优化。

posted on 2009-10-15 12:52  高比仔  阅读(224)  评论(0编辑  收藏  举报

导航