利用压缩网页来提升网站浏览速度

news/2024/5/12 14:40:27/文章来源:https://blog.csdn.net/raren/article/details/2575837

级别: 中级

刘 冬 (javayou@gmail.com), 开发工程师,  

2007 年 2 月 28 日

本文主要介绍如何通过对页面进行压缩从而节省网站的带宽以及提升用户的访问速度。

网站的访问速度是由多个因素所共同决定的,这些因素例如应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的一个因素是应用程序本身的响应速度,因此当你为网站性能所苦恼时,你第一个需要着手进行处理的便是尽可能的提升应用程序的执行速度,你可以使用缓存或者是优化代码的执行效率来提升应用程序的速度。

但是,本文并不是介绍如何来提升应用程序的执行效率,前面提到的只不过是为了防止您病急乱投医。在确保您的应用程序的性能已经达到足够好,同时服务器的性能也完全满足的情况下,不妨来试试网页压缩来进一步提升网页的浏览速度,而且非常重要的是,它完全不需要任何的成本,只不过是会让您的服务器CPU占用率稍微提升一两个百分点而已或者更少。

网页压缩是一项由 WEB 服务器和浏览器之间共同遵守的协议,也就是说 WEB 服务器和浏览器都必须支持该技术,所幸的是现在流行的浏览器都是支持的,包括 IE、FireFox、Opera 等;服务器有 Apache 和 IIS 等。双方的协商过程如下:

  1. 首先浏览器请求某个 URL 地址,并在请求的头 (head) 中设置属性 accept-encoding 值为 gzip, deflate,表明浏览器支持 gzip 和 deflate 这两种压缩方式(事实上 deflate 也是使用 gzip 压缩协议,下面我们会介绍二者之间的区别);
  2. WEB 服务器接收到请求后判断浏览器是否支持压缩,如果支持就传送压缩后的响应内容,否则传送不经过压缩的内容;
  3. 浏览器获取响应内容后,判断内容是否被压缩,如果是则解压缩,然后显示响应页面的内容。

在实际的应用中我们发现压缩的比率往往在 3 到 10 倍,也就是本来 50k 大小的页面,采用压缩后实际传输的内容大小只有 5 至 15k 大小,这可以大大节省服务器的网络带宽,同时如果应用程序的响应足够快时,网站的速度瓶颈就转到了网络的传输速度上,因此内容压缩后就可以大大的提升页面的浏览速度。

接下来我们介绍几种常用的环境下如何启用网页压缩功能。

纯 Tomcat 服务器

如果您的 WEB 应用程序是跑在 Tomcat 服务器下的,而且直接使用 Tomcat 所提供的 HTTP 服务,那建议你马上动手,因为实在是太简单了,你只需要在 server.xml 配置文件中给 HTTP Connector 增加一个 compression 的参数值为 on 并重启 Tomcat 服务器就立刻生效,配置如下:

    <Connector port="8080" protocol="HTTP/1.1" 
maxThreads="150" connectionTimeout="20000" 
redirectPort="8443" compression="on"/>

Tomcat 采用的是 HTTP/1.1 的 GZIP 压缩协议,它会根据浏览器送过来的请求中的 accept-encoding 值是否包含 gzip 来判断浏览器是否支持 gzip 压缩协议,如果浏览器支持就启用 gzip 压缩,否则就不进行任何压缩处理。Tomcat 中还有另外一个参数 compressableMimeType,这个参数可以用来指定压缩哪种类型的内容,例如可以指定该配置值为:text/html,text/plain ,则只压缩 contentType 为 text/html 和 text/plain 的页面,不过您最好也将 css 和 javascript 文件也算在压缩的文件类型中,因为这两者的压缩效果也十分的明显。

回页首

Apache 服务器

在 apache 1.3 版本,大家常用 mod_gzip 对输出内容进行压缩,现在主流的浏览器都支持 gzip 解压缩。在 apache2 下,这个模块换名为 mod_deflate,对应的模块文件名是 mod_deflate.so。mod_gzip 本文不做介绍,下面描述一下在 Apache 2 下如何启用并配置 mod_deflate 模块。默认安装的 Apache 不管是 Windows 还是 Linux/Unix,都是不启用该模块的, Linux/Unix 下甚至不带该模块,你需要手工编译这个模块。

下面我们分别介绍在 Windows 和 Linux 操作系统下如何启用并配置 mod_deflate 模块。

在 Windows 下采用安装程序安装的 Apache 服务器已经带有 deflate 所需要的模块 mod_deflate.somod_headers.so,我们只需要在 httpd.conf 配置文件中启用并进行相关的配置即可,配置如下:

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4/.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch /bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch /bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>

而如果是 Linux/Unix 操作系统,如果你没有在编译安装的过程中将所需要的两个模块 mod_deflatemod_headers 编译进去的话,那就稍微有点麻烦,首先我们先看如何在编译安装 Apache 过程中也同时编译这两个模块,请在执行 configure 程序时增加两个参数分别是:

# ./configure --enable-deflate --enable-headers

这样在编译完 Apache 后就可以直接在 httpd.conf 中启用并配置 deflate 模块了,配置的方法跟 Windows 平台下是相同的。

如果说您的 Apache 已经在运行了,不想再重新编译一次,那也可以选择只编译 deflate 模块所需的文件 mod_deflate.cmod_headers.c。这两个文件位于 {apache-src}/modules/filters/ 目录下(其中 {apache-src} 为 apache 源文件所在的目录)。使用如下命令来单独编译这两个源文件。

# {apache-bin}/apxs -i -a -c {apache-src}/modules/filters/mod_deflate.c
# {apache-bin}/apxs –i –a –c {apache-src}/modules/filters/mod_headers.c

其中 {apache-bin} 为 Apache 安装目录下的 bin 目录,接下来在 httpd.conf 直接配置该模块即可。

很多时候你在单独编译 deflate 模块的时候可能会碰到编译错误,提示是:

Cannot load /opt/apache/modules/mod_deflate.so into server: /opt/apache/modules/mod_deflate.so: undefined symbol: deflate

解决的方法如下:

编辑 /usr/local/apache2/bin/apr-config 文件修改其中的 LDFLAGS 值为 "-lz",然后再重新编译 mod_deflate 模块,apxs -ica mod_deflate.c 即可。

为了省却不必要的麻烦,请尽量在编译安装时直接加上 --enable-deflate --enable-headers 参数。

回页首

IIS 服务器

微软的 IIS 服务器同样也是目前用得最多的 WEB 服务器之一,而且用来运行 ASP 页面也是必不可少的。IIS6 本身支持 gzip 压缩,IIS5 就比较费劲了,你可以找一些第三方的组件来处理,例如 httpzip,网址是:http://www.port80software.com/products/httpzip/?vid=3354166,不过这玩意是收费的。接下来我们介绍如何在 IIS6 中启用压缩功能。

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

图1 设置网站属性 图1 设置网站属性

接下来配置 gzip 组件,在 Internet 信息服务(IIS)管理器,点击 "Web 服务扩展"->"增加一个新的 Web 服务扩展...",在 "新建 Web 服务扩展" 框中输入扩展名 "HTTP Compression",添加 "要求的文件" 为 C:/WINDOWS/system32/inetsrv/gzip.dll,选中 "设置扩展状态为允许",如下图所示:

图2 设置 Web 服务扩展 图2 IIS 设置 Web 服务扩展 图3 新建 Web 服务扩展 图3 新建 Web 服务扩展

还没完呢,我们还需要修改一个配置文件,修改之前请先停止 IIS 服务,打开 C:/Windows/System32/inetsrv/MetaBase.xml,这个文件很大,找到下面一段信息:

<IIsCompressionScheme	Location ="/LM/W3SVC/Filters/Compression/gzip"
HcCompressionDll="%windir%/system32/inetsrv/gzip.dll"
HcCreateFlags="1"
HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE"
HcDynamicCompressionLevel="0"
HcFileExtensions="htm
html
txt"
HcOnDemandCompLevel="10"
HcPriority="1"
HcScriptFileExtensions="asp
dll
exe"
>
</IIsCompressionScheme>

增加一些要进行压缩的文件后缀,其中 HcFileExtensions 是静态文件的扩展名,增加 js 和 css 等;HcScriptFileExtensions 为动态文件的扩展名,增加 aspx,保存后启动 IIS 即可生效。

最后我们介绍如何来测试前面所做的工作是否起效,你可能会觉得很奇怪,配置好了,用浏览器打开页面正常,查看页面源码,内容并没有变化,大小也跟原来一样,怎么回事呢?这是因为浏览器已经把内容解压了的结果,有两个方法来判断压缩是否生效:第一,查看 WEB 服务器的日志,不管是 Apache 或者是 IIS,二者的访问日志格式都差不多是下面这种格式:

127.0.0.1 - - [14/May/2006:08:44:28 +0800] "GET /manual/style/css/manual.css HTTP/1.1" 200 19351

最后两个数字分别是 HTTP 的结果码(200 表示 OK),19351 表示的是响应内容的大小,把这个大小跟你在浏览器上查看源码的大小比较一下就可以知道是否生效。另外一种方法就是自己写一个 HTTP 客户端的小程序并设置 Accept-Encoding 的值为 gzip,deflate,由这个程序去请求服务器端的某个 URL 地址,然后打印出响应的内容,如果是一堆乱码,恭喜你,配置成功。下面是一段 Java 写的测试客户端代码(需要用到 commons-httpclient 包):

HttpClient http = new HttpClient();		
String url = "http://www.dlog.cn/javayou";
GetMethod get = new GetMethod(url);
try{
System.out.println("fetching url : "+ url);
get.addRequestHeader("accept-encoding", "gzip,deflate");
int er = http.executeMethod(get);
if(er==200){
System.out.println(get.getResponseContentLength());
String html = get.getResponseBodyAsString();
System.out.println(html);
System.out.println(html.getBytes().length);
}
}finally{
get.releaseConnection();
}
回页首

结论

以上是目前比较流行的两个 WEB 服务器软件以及 Tomcat 服务器对于页面压缩的配置方法;其他的一些 J2EE 应用服务器如果不支持这个功能的话可以考虑利用过滤器(Servlet Filter)来进行处理,具体的代码以及配置方法可以参考 Resin 服务器所提供的文档。但是有一点需要提醒各位读者的是,本文介绍的访问只是在服务器本身的响应速度已经足够优化的情况下进行,也就是说在带宽成为系统瓶颈的时候才来考虑该方案。

参考资料

  • Apache Http Server 相关信息。
  • Tomcat 相关信息。
  • IIS 6 相关信息。
  • mod_deflate 详细配置文档。
  • Resin 相关文档。

关于作者

 

刘冬,一直使用 J2EE/J2ME 从事移动互联网方面的开发,拥有开源博客产品 DLOG4J,目前 DLOG4J 已经推出3.0多用户版。您可以通过 Java 自由人网站来跟他联系,网址是:http://www.dlog.cn/javayou ,另外他的邮件地址是 javayou@gmail.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_890912.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站多级缓存的分层架构

参考&#xff1a;大型网站多级缓存的分层架构 假设一个网站&#xff0c;需要提高性能&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服务器&#xff0c;还可以放在应用程序进程内&#xff0c;同时可以放在分布式缓存系统中。 从用户请求数据到数据返回&#x…

网站中如何处理重复的代码

网站中如何处理重复的代码 作者&#xff1a;闪吧 类型:原创 来源:闪吧 style"PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 400px; PADDING-TOP: 0px; HEIGHT: 25px" src"teachInfo.aspx?id4051" frameborder&…

网站优化十大方法之关键字篇

1、 选择有效的关键字&#xff1a; 关键字是描述你的产品及服务的词语&#xff0c;选择适当的关键字是建立一个高排名网站的第一步。选择关键字的一个重要的技巧是选取那些常为人们在搜索时所用到的关键字。 2、 理解关键字&#xff1a; 在你收集所需的关键字之前&#xff0c;…

孩子上网抄作业 习题网站点击率高 ----回想当年....我们真是落伍了

孩子上网抄作业 习题网站点击率高 作者&#xff1a;王迪 | 2005-01-13 | 原始出处&#xff1a; 四川在线-华西都市报 昨日上午&#xff0c;家住成都的黄先生打进本报教育新闻热线(028-86969195)无奈地说&#xff1a;"在一些网站上&#xff0c;初中各科的课后习题的解题过程…

Java、JSP基于Web的小型购书网站

技术&#xff1a;Java、JSP等 摘要&#xff1a;俗话说活到老&#xff0c;学到老&#xff0c;当今社会正在快速的发展&#xff0c;人民生活的更加节奏化&#xff0c;大多数的人不再仅仅追求物质上的满足&#xff0c;而且还在追求精神方面的满足。由于在现实生活中&#xff0c;互…

【服务计算】REST API学习与设计——模仿GithubAPI设计博客网站API

文章目录 什么是REST&#xff1f;了解Web API学习Github-API设计博客网站API获取用户信息获得某用户所有文章总览访问用户的某一个指定的文章查看某用户关注信息获取用户下的分类专栏文章发布文章发布评论修改文章删除文章 错误处理404 Not Found400 Bad Request401 Unauthoriz…

相对定位父子元素触发mouseover和mouseout事件实验

最近做的一个项目中有个功能是鼠标移动到某一块id为A&#xff0c;然后A的子元素id为B在下方紧贴着父元素A显示出来&#xff0c;B里面的内容是鼠标移动到A元素上才请求服务端获取数据。 我使用了mouseover&#xff0c;mouseout事件&#xff0c;采用jquery的on方法。大致如下 $(…

相关网站(Github、个人博客等)的编程相关学习资源和可下载电子书导航,不定时更新

编程相关学习资源和可下载电子书项目导航&#xff0c;不定时更新 前言Python学习资源与书籍Python入门教程-By廖雪峰 -学习资源《Python进阶》-可下载电子书python深度学习入门 C#学习书籍 前言 作为广为人知的开源项目网址&#xff0c;Github已经被许多大牛玩出了花。理所当然…

爬虫练习——某网站上海房价分析

前言 实验数据来源自某看房网站&#xff0c;通过爬虫一共爬取了一千六百多条数据。能力有限&#xff0c;实验结果仅供参考。 该网站几乎没有什么反爬虫措施&#xff0c;原理很简单&#xff0c;所以关键就是定位自己想要的信息。 工具 1、爬虫工具&#xff1a;request&#x…

开源中国网站挂掉了...

现在是2013-08-24 18:48:19 有图为证&#xff1a;

基于C#和SQL SERVER的校园知识问答论坛网站的设计与实现

摘 要 本文使用Asp.Net Core 和MsSqlServer技术&#xff0c;详细说明开发校园知识论坛系统的开发。校园知识论坛系统是基本B/S模式的一种交互性极强的电子信息服务系统。它为使用者提供一个交流的平台&#xff0c;每一个用户都可以在上面问答知识&#xff0c;获取信息&#xff…

基于JavaScript和MySQL的文化平台网站的设计与实现

摘要 中国文化源远流长&#xff0c;自古就有文人雅士作诗赋词&#xff0c;舞文弄墨&#xff0c;尽显风雅。现今则有歌手作家思想成文&#xff0c;心绪为曲&#xff0c;亦现儒雅。文化是传承的&#xff0c;是流传不息的&#xff0c;也是众多人所追求的。从各种各样的文化中&…

基于Node.js中间层的微信图书借阅平台网站的设计与实现

1 引言 步入信息时代以来&#xff0c;互联网给人们的生活带来了翻天覆地的变化&#xff0c;互联网也不再简单地仅仅通过提供便利快捷的资讯服务来丰富我们的生活。互联网的出现打破了许多传统行业垄断的格局&#xff0c;互联网以其接入面广、信息即使、人人可参与等等性质&…

基于Keras和tensorflow深度学习Python实现的支持人脸识别和情绪分类的社区APP网站和微信小程序...

1 项目介绍 1.1 背景 视觉使人类得以感知和理解周边的世界&#xff0c;人的大脑皮层大约有 70%的活动在处理 视觉相关信息。计算机视觉即通过电子化的方式来感知和理解影像&#xff0c;以达到甚至超 越人类视觉智能的效果。 从 1966 年学科建立&#xff08;MIT&#xff1a;TheS…

基于php与sqlite数据库的运动社交网站

一、总体设计 1.1 开发环境 本系统采用php作为主要开发语言&#xff0c;服务端主要使用php&#xff0b;sqliteApache&#xff0c;客户端使用htmlcssjs。用Apache作为服务器&#xff0c;采用sqlite作为后台数据管理系统。 开发环境&#xff1a;Windows 10 开发工具&#xff1a;p…

[源码和文档分享]基于C#实现的电影网站数据爬虫和电影网站

1 简介 1.1 背景 随着网络的发展&#xff0c;网购也越来越流行&#xff0c;人们可以在去各大电影院的网站方便的购票并选择自己喜欢的时间去影院观看。但电影院网站众多&#xff0c;人们可能为了寻找一个电影而奔波与各大网站&#xff0c;导致浪费大量时间在寻找电影资源上。本…

[源码和文档分享]基于JAVA FX实现的酒店预订系统网站

1 产品概述 参考酒店预订系统用例文档和酒店预订系统软件需求规格说明文档中队产品的概括描述。酒店预订系统主要是应用于网上预定远程酒店订单的在线系统&#xff0c;主要功能见用例图如下。 源码下载地址&#xff1a;https://www.write-bug.com/article/1441.html

[源码和文档分享]基于PHP和MYSQL数据库实现的公共考试报名管理系统网站

前 言 随着社会的快速发展&#xff0c;体力不再是我们唯一的生存方式了&#xff0c;人们也越来越注重自身的文化素养&#xff0c;随之而来的也有许多成人考试&#xff0c;为已经步入社会的人提供一个再学习的机会。 众所周知&#xff0c;作为学生&#xff0c;考试是我们必经的过…

[源码和文档分享]基于Python的Django框架实现的中式快餐厅管理信息系统网站

1 初步调研 随着餐饮业的连锁和国外餐饮巨头的进入&#xff0c;餐饮业的竞争将越来越激烈&#xff1a;要想在竞争中处于不败之地&#xff0c;必须在管理、服务等方面提高服务管理意识。面对当前餐饮业普遍的产业化程度低&#xff0c;管理手段、管理技术落后等问题&#xff0c;使…

[源码和文档分享]基于PHP和MYSQL数据库实现的libilibi电影论坛网站

一、需求分析 1.1 需求描述 1.1.1 用户相关功能 登录&#xff1a;前端输入用户名和密码&#xff0c;在数据库中完成查询&#xff0c;如果存在该用户&#xff0c; 则登陆成功&#xff0c;继续其他操作&#xff1b;如果不存在&#xff0c;则登录失败&#xff0c;提示用户名/密码错…