Java堂  


Apache+Resin泛域名的设置

归档在: Web&Server — Jet @ 3:25 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/03/18/2532264.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Apache中如果设置范域名的话使用 ServerAlias ,比如

  1. <VirtualHost *:80>
  2.   ServerName javatang.com
  3.   ServerAlias *.javatang.com
  4.   ...
  5. </VirtualHost>

如果使用Apache+Resin架构的话,需要在Resin中设置同样的泛域名与Apache进行对应。在Resin中设置泛域名使用 host-alias-regexp 标签,对应于上面Apache在Resin中设置如下:

  1. <host id="javatang.com" root-directory=".">
  2.    <host-alias-regexp>^([^/]*).javatang.com</host-alias-regexp>
  3.    ...
  4. </host>

参考资料:
host-alias-regexp
apache、resin泛域名、多域名设置

Zend Optimizer 出错造成站点无法访问

归档在: Web&Server — Jet @ 3:17 上午
原文出处: http://www.javatang.com/archives/2008/02/28/1713261.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天有朋友的服务器出现站点无法访问的状况,登录进去看到Apache占用了服务器的大部分内存导致服务器剩余内存很少,如果重启Apache的话依然无法释放内存,只有重启服务器之后才正常。

查看“事件查看器”中出现一个Zend Optimizer错误,而且这个错误都是每次启动服务器之后产生的:

事件类型: 错误
事件来源: Zend Optimizer
事件种类: 无
事件 ID: 487
日期: 2008-2-28
事件: 9:22:15
用户: N/A
计算机: XXX
描述:
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: Unable to view file mapping, 试图访问无效的地址。

查阅了一下网上的资料,其实只有一个版本,具体内容可以看下面的参考资料。我这里结合自己的解决方法总结一下:

首先如果你的PHP使用了eAccelerator则将其注释掉就可以了,这是因为Zend Optimizer同eAccelerator相冲突。其实二者都是用于加速PHP程序的,只要使用其中的一个就可以了。

如果你的PHP没有使用eAccelerator的话则大部分是权限的问题了,这种情况在Apache+PHP中很少见,通常都是在IIS+PHP这种搭配中出现的比较多。这个时候只需要修改%SystemRoot%\Temp的权限,设置为EveryOne全部允许;然后如果该目录下没有ZendOptimizer.MemoryBase@SYSTEM文件的话就手动新建一个文本文件然后命名为ZendOptimizer.MemoryBase@SYSTEM即可。

如果还是有问题的话可以查看一下php下的ext目录中是否有php_yaz.dll和php_zip.dll两个文件,有哪一个就在php.ini将 “extension=…”前面的分号去掉。

做完上面的操作之后如果依然出现问题的话请在下面留言或给我mail,可以再继续探讨。

[后续(2008.3.4):]做完上述的操作之后依然出现上面的错误,不过错误出现的次数少了而已,最后不得已将Zend卸载掉了。现在感觉好像应该是Zend Optimizer的一个bug吧。

参考资料:
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。
解决“事件ID(487)的描述(在资源(Zend Optimizer)中)无法找到”问题

Windows NT系统下的Apache性能优化

归档在: Web&Server — Jet @ 3:08 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/02/19/0801260.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

一般来说,WinNT系统下使用IIS,而Apache在Linux下应用的比较多,但是依然有很多人在WinNT系统下使用Apache而非IIS,可能是基于对Windows系统的熟悉吧。今天就来说一下在Windows系统下如果优化Apache的性能。

mpm_winnt.c是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。也就是说mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。

mpm_winnt主要通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache,下面详细来说明一下。

ThreadsPerChild
这个参数用于设置每个进程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为mpm_winnt不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡一个合理的数值。

mpm_winnt上的默认值是64, 最大值是1920. 这里建议设置为100-500之间,服务器性能高的话值大一些,反之值小一些。

MaxRequestsPerChild
该参数表示每个子进程能够处理的最大请求数, 即同时间内子进程数目.设置为零表示不限制, mpm_winnt上的默认值就是0.

官方参考手册中不建议设置为0, 主要基于两点考虑: (1) 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存; (2) 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

因此这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为0或很大的数字,否则设置一个小的数值。需要说明的是,如果这个值设置的太小的话会造成Apache频繁重启,在日志文件中会看到如下的文字:

Process exiting because it reached MaxRequestsPerChild. Signaling the parent

这样一来降低了Apache的总体性能。

另外,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开它:

  1. # 首先需要加载mod_status模块
  2. LoadModule status_module modules/mod_status.so
  3.  
  4. # 然后设置访问的地址
  5. <Location /server-status>
  6.     SetHandler server-status
  7.     Order deny,allow
  8.     Deny from all
  9.     # 如果限制某个IP访问则设置为 Allow from 192.168.1.1
  10.     Allow from all
  11. </Location>

综合来说,因为Windows NT下Apache只能启动父子两个进程,因此只能通过增大单个进程的线程数以及单个进程能够处理的最大请求数来进行优化。其他优化的参数同Linux系统下是一样的,大家可以加以参考。下面针对上述两个参数给出一个建议的设置:

  1. <IfModule mpm_winnt.c>
  2.   ThreadsPerChild 250
  3.   MaxRequestsPerChild 5000
  4. </IfModule>

参考资料:
Apache参考手册
Apache模块 mod_status

解决Apache出现的CPU高占用率的问题

归档在: Web&Server — Jet @ 10:06 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/01/22/0615259.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。

下面我们针对几种错误信息进行分析并给出解决的方法:

1. Apache与WinSock v2相冲突
Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。

其错误提示如下所示:

[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

[error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

[warn] (OS 121)信号灯超时时间已到。 : winnt_accept: Asynchronous AcceptEx failed.

[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

可以依次采用下面的方法来解决上面的问题,如果进行了一步还有问题就继续下一步:

1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API :

  1. <IfModule mpm_winnt.c>
  2. Win32DisableAcceptEx # 禁止使用AcceptEx()
  3. </IfModule>

2) 使用System Repair Engineer(SREng)查看WinSocket供应者,如果出现非MS的陌生项则将其删除,并使用软件的“重置WinSocket”按钮进行重置。

3) 卸载与Apache相冲突的杀毒软件或防火墙软件。

如果进行上面的三个步骤之后还有问题,那应该看看是不是还有下面的错误。

2. 是否加载了第三方模块(so文件)
Apache2.x要求所有的第三方模块都必须是线程安全的,但有很多第三方的模块可能存在内存泄露,因此时间一长就可以极大的消耗Apache资源。所以可以采用将所有的第三方模块逐个关闭的方法看看运行一段时间之后Apache对资源的占用是否有所改善。

3. “Terminating 1 threads that failed to exit”错误
上面错误中的数字1有可能是其他数字,造成这个错误的原因是Apache在关闭并发线程的时候出现线程溢出,从而造成内存泄露,表现出来的就是Apache所占用的系统资源持续增长。

具体来说,Apache的子进程在结束当前请求之前会首先将所有的并发线程进行关闭,在关闭的时候会等待3分钟,如果3分钟之内没有将所有的线程关闭则会抛出上述的错误提示,然后强制关闭。这样就造成了内存溢出,时间一长会使得Apache所占用资源持续增长直到无法工作。这个时候可以适当将MaxRequestsPerChild的值降低,使得Apache子进程所并发的线程数量减少,从而降低该错误出现的几率。

但是这种方式并不能彻底解决问题,幸好Apache2.0.x的最新版本(2.0.63)解决了之前版本的这个问题,如果3分钟之内有线程没有关闭的话会自动根据时间情况再增加等待结束的时间直到最终将所有的线程结束。日志文件中会出现类似下面的信息:

Child 1952: Waiting 150 more seconds for 2 worker threads to finish.
Child 1952: Waiting 120 more seconds for 1 worker threads to finish.
Child 1952: All worker threads have exited.

4. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion “(rv >= 0) && (rv < threads_created)” failed” 错误

这个错误是Apache的一个bug(#11997),可以通过 Win32DisableAcceptEx 禁止Apache使用WinSocket v2来避免此bug,具体设置见前述。

5. PHP5.2.1以上版本的libmysql.dll与MySQL5不兼容
PHP5.2.1以后的新版本(截止目前最新版本为5.2.5)中用于连接MySQL的libmysql.dll组件与MySQL5不兼容,在Apache中运行PHP的时候会造成Apache产生CPU100%的问题。

解决的方法就是从http://www.php.net/releases/下载5.2.1版本,将压缩包中的libmysql.dll文件覆盖现在的文件,然后重启Apache就可以了。

6. 病毒或木马程序命名为Apache.exe
有的时候病毒或木马程序会将其名称命名为Apache.exe文件达到一种掩饰的目的,这个时候使用第三方进程分析器查看进程的路径然后将其删除或使用杀毒软件清除就可以了。

7. 程序编写不严谨造成死循环等错误
如果上面的问题都不存在Apache依然产生CPU100%的问题的话,通常来说就应该是Web程序自身的问题了,例如死循环等等。这个时候需要在日志中设置HTTP请求的文件及执行的时间,然后查找出执行时间比较长的地址进行分析排查。

日志格式设置如下:

LogFormat “%v %h %l %u %t [%Ts] \”%r\” %>s %b” vhost_common #设置程序执行时间

<VirtualHost xxx.xxx.xx.xx:80>
ServerName xxx.xxx.com
DirectoryIndex index.php index.html index.htm
DocumentRoot “xxx”
# cronolog.exe用于将日志文件进行分割的应用程序,可以在 http://cronolog.org/ 下载
CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common
</VirtualHost>

参考资料:
apache 遇到[error] (OS 10038) 错误
Error in my_thread_global_end(): 1 threads didn’t exit
Apache 2.2.x (ASF) faulting module errors
Need some advice on Apache 2.2.4 PHP 5.2.3 MYSQL 4.0.26
查看Apache并发请求数及其TCP连接状态
Apache Bug 11997
关于apache.exe开机占用cpu100%的终极解决方法
apache cpu占用100%的问题。
空间持续CPU100%时间过长,如何优化程序

Apache中显示PHP源代码的原因

归档在: DynamicLanguage, Tools, Web&Server — Jet @ 10:53 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2007/10/05/5331208.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

通常来说如果Apache显示PHP源代码的主要原因是因为没有正确配置好PHP加载模块,最多的错误就是加载的php5_module文件位置错误,通常这种错误会导致Apache无法正常启动;另外最容易犯的就是没有增加php的文件头类型:

  1. AddType application/x-httpd-php .php .php3

但是今天我确遇到一件非常奇怪的事情,上面说的两种情况都不存在但是依然显示php源代码。后来经过长时间的排查终于发现误将放置在 VirtualHost 标签内的

  1. php_flag engine off

放到了外面,这种情况下使得针对某个站点不执行php解析的配置被设置为了全局配置了,估计这种失误比较少见,故写出来共享。

Apache2 服务因 1 (0×1) 服务性错误而停止 的问题

归档在: OS, Web&Server — Jet @ 9:58 下午
Tags:
原文出处: http://www.javatang.com/archives/2007/07/23/5805183.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Windows下面安装Apache2之后,会创建一个Apache2的Windows NT服务。有的时候会发现启动该服务时出现“Apache2 服务因 1 (0×1) 服务性错误而停止”的错误信息。通常情况下遇到该提示信息会造成Apache2无法启动,可以从下面几个方面依次着手处理:

首先Apache开始菜单中的Configure Apache Server目录下“Test Configuration”验证Apache配置文件是否有错误,如果没有错误显示OK,否则显示错误的详细信息。

如果上一步通过的话则可能是因为Apache与操作系统运行环境相冲突,比如端口冲突、ErrorLog 路径错误等等,可以逐一做上传情况的排除。

最后还要说明一点的是,如果是Apache + PHP 或 Apache + Tomcat 等形式的组合的话,除了Apache自身的原因外,还要考虑PHP或Tomcat自身的配置文件是否正确。

参考资料:
在Windows下配置Apache的一点小体会
apache 在windows下无法启动的一个错误

PHP中出现“Unable to load dynamic library”问题的解决方法

归档在: DynamicLanguage — Jet @ 3:15 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2007/07/04/1548182.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天把一个客户的服务器上面的PHP4升级到PHP5,根据前几天写的从PHP4升级到PHP5的步骤进行升级之后,总是在错误的日志文件中出现如下提示:

startup: Unable to load dynamic library : PHP5\ext\php_mysql.dll

可是明明将extension_dir设置正确了还是提示无法找到dll文件。后来在CSDN上面找到一篇相关的文章,大体意思是php扩展目录中的模块需要依赖于一些基础的dll文件,如果系统没有找到这些基础的dll文件的话也会是扩展模块产生错误。解决的方法有两种,一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去。PHP5的话只要设置其安装目录就可以了。

但是问题是我按照上面的设置还是出现上面的提示,真的是很奇怪。后来我尝试将libmysql.dll文件拷贝到system32目录下面的时候出现是否覆盖文件的提示,这个时候我才恍然大悟,原来php4中的dll目录下面的文件都被拷贝到system32目录下面而没有被删除,所以php5误将这些文件当作基础文件了。于是使用如下的批处理命令将php4留在系统中的文件一一删除即解决了问题:

  1. @echo off
  2. echo remove php4
  3.  
  4. echo remove php.ini and php4ts.dll
  5. del %SystemRoot%\php.ini
  6. del %SystemRoot%\system32\php4ts.dll
  7.  
  8. echo remove dlls from system32...
  9. del %SystemRoot%\system32\expat.dll
  10. del %SystemRoot%\system32\FDFTK.DLL
  11. del %SystemRoot%\system32\fribidi.dll
  12. del %SystemRoot%\system32\gds32.dll
  13. del %SystemRoot%\system32\iconv.dll
  14. del %SystemRoot%\system32\libeay32.dll
  15. del %SystemRoot%\system32\libmhash.dll
  16. del %SystemRoot%\system32\libmysql.dll
  17. del %SystemRoot%\system32\mSQL.dll
  18. del %SystemRoot%\system32\ntwdblib.dll
  19. del %SystemRoot%\system32\sablot.dll
  20. del %SystemRoot%\system32\ssleay32.dll
  21. del %SystemRoot%\system32\Yaz.dll
  22.  
  23. echo done!

这样说的话php5对于查找这些基础dll文件的顺序应该跟查找php.ini文件的顺序(详细见从PHP4升级到PHP5文章中的常见问题3)相反,或者是无论如何首先查看system32目录下面是否含有这些dll文件,如果存在的话就不在查找了。

增加内容(2007.9.20):
今天将PHP5.2.3升级为5.2.4之后依然出现上述的问题(系统:win2k server),但是5.2.3版本使用的很好。后来根据参考资料所说的两种方法(一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去)中的后者将php5的安装目录添加到环境变量%PATH%中之后重新启动下就OK了。但是同样的版本我在本机(系统: winxp sp2)只要在Apache设置PHPIniDir为php5安装目录就可以了,并没有设置环境变量,不知道什么原因。

参考资料:
如何解决PHP startup: Unable to load dynamic library的错误

Apache和Resin产生大容量日志的解决办法

归档在: JavaPlateform, Web&Server — Jet @ 8:15 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2007/06/20/1513177.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

昨天服务器上网站无故无法访问,重启Apache之后过一段时间又无法访问。后来无意间看到Apache的日志文件(access.log)竟然有7G多,赶紧删除之再重启Apache就OK了。但是总是这样也不是办法,如果时间一长忘记清空日志文件的话又会造成Apache死掉,另外之前Resin也产生过这样的问题。后来综合Google后的信息采用了如下的解决方法:

1. Apache日志
减少日志大小有两种方法,一种是修改日志记录级别,可以将默认的warn级别提升为error级别;

  1. LogLevel error

另外一种方法就是将日志文件按照每天创建一个文件的方式产生,这样就不会将所有的信息写入到一个文件。在Linux下可以将 httpd.conf 中 CustomLog logs/access.log common 修改为:

  1. CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/%Y_%m_%d.access.log 86400 480" common

Windows下没有rotatelogs这个工具,但是可以下载一个cronolog的软件,进入官方下载页面下载Win 32 version (ZIP file) 版本,将压缩包中的cronolog.exe解压缩到apache安装目录的bin目录下面,然后可以将CustomLog logs/access.log common 修改为:

  1. CustomLog "|bin/cronolog.exe logs/access%Y%m%d.log" combined

这样可以达到同样的效果。需要说明的是再重启Apache之后原来的cronolog.exe进程不会自动关闭,这个应该是软件的bug。官方最新的更新日期是2002-01-24,而且最新的1.6.2 版本没有windows版本,所以要耐心等待了。

2. Resin日志
前段时间提到过因为Resin日志巨大的问题而导致出错,过了这几天又发现jvm.log文件达到1G的容量了,照这样下去如果忘记清空日志的话又会导致程序出错。无意间在一篇文章中看到这样一句话:

Resin启动时通过bin目录下的wrapper.pl文件进行控制,我们可以修改这个文件来加一些参数……

后来经过测试这样的启动方式是在Linux系统下,Windows下面修改这个文件是没有作用的。记得以前我在 Resin 3.x 经验总结文章中提到在Windows下设置jvm内存的时候可以使用下面的命令:

  1. httpd.exe -Xmn100M -Xms500M -Xmx500M

是不是上面提到的wrapper.pl文件中的httpd参数都可以这样设置呢?后来在Resin官方的新闻组里面找到了这个配置参数:

You can use -jvm-log logfile as an option to httpd.exe

这样的话就可以设置Resin不产生jvm.log日志文件,因为里面的信息在web程序中通过log4j获得了。

  1. httpd -jvm-log NUL

按照以下步骤重新按照Resin的NT服务:

  1. #1 停止Resin NT服务和Apache
  2. httpd -remove
  3. #2 安装Resin NT服务
  4. httpd -jvm-log NUL -install
  5. #3 重新启动Resin和Apache

参考资料:
解决Apache日志文件ACCESS.LOG日益膨胀的一个办法
jvm.log workarounds
resin的优化

在Apache中设置防盗链资源

归档在: Web&Server — Jet @ 2:17 下午
原文出处: http://www.javatang.com/archives/2007/03/23/1704153.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Apache中设置防盗链很简单,将如下的设置添加到httpd.conf文件中即可:

  1. #
  2. # 防止盗链
  3. #
  4. # 设置防止盗链的地址
  5. SetEnvIfNoCase Referer "^http://www\.yourdomain\.com/" local_ref=1
  6. SetEnvIfNoCase Referer "^http://www\.abcname\.com/" local_ref=1
  7. # 设置类型
  8. <filesmatch></filesmatch>??
  9. Order Allow,Deny
  10. Allow from env=local_ref
  11. Allow from 127.0.0.1

使Apache实现gzip压缩

归档在: Tools, Web&Server — Jet @ 8:30 下午
原文出处: http://www.javatang.com/archives/2007/03/10/3018122.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

众所周知,在HTTP1.1中支持gzip压缩,这样可以缩小页面的容量从而加快页面的显示速度。可以使用这个在线的HTTP压缩测试工具来检测一下你的站点是否开始了gzip压缩。

Apache默认的http.conf配置文件中没有开启gzip压缩,apache1.3.x可以用mod_gzip进行优化网页浏览的速度,在apache2中也尝试用mod_gzip,但是配置后确发现网页不能正确显示(空白页),所以改换为mod_deflate。

下面说一下怎样在Apache2下开启gzip压缩:

  1. # 加载deflate模块
  2. LoadModule deflate_module modules/mod_deflate.so
  3. # 设置压缩频率,取值范围在 1(最低压缩率) 到 9(最高压缩率)之间
  4. # 不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源
  5. DeflateCompressionLevel 3
  6. # Compress everything except images
  7. <Location />
  8. # 插入过滤器
  9. SetOutputFilter DEFLATE
  10.  
  11. # Netscape 4.x 有一些问题...
  12. BrowserMatch ^Mozilla/4 gzip-only-text/html
  13. # Netscape 4.06-4.08 有更多的问题
  14. BrowserMatch ^Mozilla/4\.0[678] no-gzip
  15. # MSIE 会伪装成 Netscape ,但是事实上它没有问题
  16. BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  17. # 不压缩图片
  18. SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
  19. </Location>

通过上述的设置之后就在Apache中开启的HTTP压缩,试一下页面显示速度是不是提升了很多?

参考资料:
使用mod_deflate提升网页浏览的速度
Apache Module mod_deflate

下一页 »