Java堂  


Apache2.x中设置gzip

Filed under: Web&Server — Jet @ 1:28 下午
Tags: ,
原文出处: Apache2.x中设置gzip
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Apache2.x中使用mod_deflate进行gzip压缩,配置信息如下:

  1. LoadModule deflate_module modules/mod_deflate.so
  2. LoadModule headers_module modules/mod_headers.so
  3.  
  4. # gzip 设置
  5. # Only compress specified content type
  6. # see also http://www.devside.net/guides/config/compression
  7. <IfModule mod_deflate.c>
  8.     # The value must between 1 (less compression) and 9 (more compression)
  9.     DeflateCompressionLevel 7
  10.     # compress content with type html, text, and css
  11.     AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/json
  12.     # place filter 'DEFLATE' on all outgoing content
  13.     SetOutputFilter DEFLATE
  14.     # Properly handle old browsers that do not support compression
  15.     BrowserMatch ^Mozilla/4 gzip-only-text/html
  16.     BrowserMatch ^Mozilla/4\.0[678] no-gzip
  17.     BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  18. </IfModule>

参考资料:
apache 2.2.15中配置mod_deflate
httpd.conf — compression

Apache和Resin组合时间歇性出现503错误的解决方法

Filed under: JavaPlateform,Web&Server — Jet @ 5:12 下午
Tags: ,
原文出处: Apache和Resin组合时间歇性出现503错误的解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

使用Apache和Resin进行组合时,如果Resin关闭或中断的时会出现如下的HTTP 503错误:

Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

造成这个错误的原因是因为Resin无法启动,可以单独访问resin(如8080端口)查看具体的错误。

我这里要说的是,在Resin和Apache都非常非常正常的情况下,间歇性的出现上述错误,也就是说不是一直有,而是偶尔出现这个错误,刷新下页面就好了。这个问题非常郁闷,后来在resin的bug报告中(见参考资料)竟然发现了解决的办法:

The important configuration are load-balance-socket-timeout, socket-timeout, load-balance-idle-time and keepalive-timeout. The two load-balance-* configure mod_caucho. socket-timeout and keepalive-timeout configure the Resin side.

load-balance-socket-timeout needs to be large enough to handle any server-side processing delays before the first data.

socket-timeout and keepalive-timeout need to be larger than load-balance-idle-time because they need to keep the connection open for a keepalive request.

For a diagram, see

http://caucho.com/resin/admin/load-balancing.xtp

也就是说,Resin在同Apache进行组合通讯的时候主要依靠四个参数:load-balance-socket-timeout, socket-timeout, load-balance-idle-time 和 keepalive-timeout,其中两个load-balance-*参数用来设置mod_caucho(就是与Apache组合的so文件),socket-timeout和keepalive-timeout用来设置Resin。至于参数数值的大小顺序依此是:load-balance-socket-timeout > socket-timeout 和 keepalive-timeout > load-balance-idle-time。上述四个参数的官方说明地址为:http://caucho.com/resin-3.1/doc/server-tags.xtp

那为什么会间歇性出现503错误呢?这个是因为resin默认的socket-timeout为65s,时间太短了,有些比较大的请求在这个时间之内还没有进行完。综合上面所说,参考的配置如下:

  1. <resin ...>
  2.     <cluster id="app-tier">
  3.         <server-default>
  4.             <socket-timeout>180s</socket-timeout>
  5.             <keepalive-max>3000</keepalive-max>
  6.             <keepalive-timeout>180s</keepalive-timeout>
  7.             <load-balance-idle-time>120s</load-balance-idle-time>
  8.         </server-default>
  9.     </cluster>
  10. </resin>

从此,这个世界清净了。

参考资料:
Apache 2.2.x + Resin 3.1.x: frequent 503 status error messages (Service Temporarily Unavailable)
0002862: Apache + Resin and 503 HTTP Error
resin apache问题

Apache和Resin组合时UrlRewriteFilter失效的解决方法

Filed under: Tools,Web&Server — Jet @ 5:36 下午
Tags: ,
原文出处: Apache和Resin组合时UrlRewriteFilter失效的解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

目前在Spring3.0的官方example中都使用UrlRewriteFilter来做伪静态,单独运行在Resin等JavaEE Web容器中的时候一切都OK,但是一旦与Apache一起组合的时候总是会出现404或403错误,当然UrlRewriteFilter所设定的规则也无效。

造成这种现象的原因是因为在默认情况下,静态的资源均由Apache进行处理,而jsp或者由web.xml所映射的servlet均交给resin进行处理。如果web项目没有使用UrlRewriteFilter则一切OK,但是使用了UrlRewriteFilter之后,由servlet所映射的地址并不是/*即所有资源了,而是类似/app/*这样的设置。也就是说,用户所请求的资源首先由Apache判断一下,然后再由选择的交给Resin,最后才执行UrlRewriteFilter的规则。

知道了原因,解决的方法也就出来了,只要告诉Apache将所有的资源都交由Resin来处理就可以了,可以使用Resin的servlet-mapping方法进行配置,配置如下:

  1. <servlet-mapping url-pattern='/*' servlet-name='plugin_match'/>

其中plugin_match是Resin内置的servlet,按照resin官方的解释就是Resin告诉Apache将所有的符合url-pattern规则要求的请求都发送给它进行处理。

因为servlet-mapping是resin特有的,所以建议将此也放在resin-web.xml中,然后放在项目中的WEB-INF目录下:

  1. <web-app xmlns="http://caucho.com/ns/resin"
  2.          xmlns:resin="http://caucho.com/ns/resin/core">
  3.     <servlet-mapping url-pattern='/*' servlet-name='plugin_match'/>
  4. </web-app>

参考资料:
Apache的UrlRewrite和Resin的配置问题
Resin官方对servlet-mapping的说明

Apache下FastCGI模块的众多版本

Filed under: OS,Web&Server — Jet @ 8:36 上午
Tags: ,
原文出处: Apache下FastCGI模块的众多版本
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

这两天在Apache上配置以FastCGI方式来加载PHP和Perl,连续花了三天的时间才正式配置好并且稳定了,配置的话到不是很麻烦,关键是配置好之后还要稳定。后续我会将整个过程记录下来给大家分享,今天我要先说的是FastCGI的版本问题。

目前我们在网上能够找到的FastCGI有三个版本:
(1) mod_fastcgi:官方地址是http://www.fastcgi.com/。这个可以说是最初始的FastCGI的版本,可惜的是现在作者已经好久没有维护了,现存编译好的版本非常少,其官方网站更多的是以一个“标准”的姿态出现的。现在给出通过官方网站没法直接找到的两个地址,一个是下载地址http://www.fastcgi.com/dist/,另外一个是相关的配置参数的文档http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html。虽然是官方标准,但是不建议在生产环境中直接使用,因为它特别的不稳定,而且兼容性极差。

(2) mod_fcgid v2.2:官方地址是http://fastcgi.coremail.cn/,不过网站现在打不开了,所幸的是可以在http://www.apachelounge.com/download/网站上下载。fcgid是在fastcgi的基础上进行了扩展和优化,并且针对Apache的新版本做了及时的更新,使得可以在生产环境下使用,二者具体的区别可以阅读下面的参考资料。原来在coremail上所提供的文件因为现在网站没法访问,所以具体的关于ApacheLounge上所提供的mod_fcgid2.2和coremail上所提供的有什么区别我不是很了解。所幸我找到了作者的邮箱,通过跟作者邮件沟通了解到,原来作者在做完第一个版本的fcgid之后就将源代码发布到了网上,后来ApacheLounge的Steffen使用源代码重新在Windows下面编译后发布了可以直接使用的二进制版本的mod_fcgid.so文件。同时,Steffen也是Apache Windows版本的一个维护者。经过试用,我感觉这个版本的mod_fcgid是最适合在Windows环境下使用的。

(3) mod_fcgid v2.3.x +:官方地址为http://httpd.apache.org/mod_fcgid/,相关文档地址为:http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html。这个是目前Apache官方所提供的mod_fcgid,目前最新版本为2.3.4。通过作者了解到,这个是作者将原来放在coremail上的mod_fcgid代码捐献给Apache之后由Apache官方来维护的一个版本,可以说是2.2版本之后的后续版本。但是我在Windows上面使用之后感觉不是很稳定,Apache总是隔一段时间就自动关闭,不知道是我设置的问题还是其他问题。

综合来看,上面三个版本的情况如下:

  • mod_fastcgi:最初始的标准版本,适合开发,不适合直接在生产环境中使用;
  • mod_fcgid v2.2:目前在Apache Lounge上提供下载,个人认为是最适合在Windows环境下使用的一个版本,缺点是因为原来的fastcgi.coremail.cn网站已经不能访问,所以所参考的文档极少;
  • mod_fcgid v2.3.x +:最新最稳定的官方版本,其特点是目前mod_fcgid中最新的版本,而且是有官方来维护,文档内容也非常丰富。但以我个人使用来看,在Windows环境下不是很稳定。
  • 更新(2010.1.8):经过同mod_fcgid原作者Ryan Pan (Pan Qingfeng, pqf or 潘庆峰)沟通,他已经答应将原来在http://fastcgi.coremail.cn/的内容放到本站做镜像,详细说明见http://www.javatang.com/mod_fcgid-v2-2-mirror

    附同mod_fcgid作者沟通的邮件内容(经本人允许):

    庆峰,你好!
    很冒昧的给你发mail,我是mod_fcgid的使用者,有个疑问一直未知,就是关于mod_fcgid版本的问题。我现在在网络上找到三种mod_fcgid的版本:
    (1) 在http://www.apachelounge.com/download/上列出的两个mod_fcgid-2.2b-w32.zip(用于Apache 2.2.9+)和 mod_fcgid-2.2a-w32.zip(用于Apache 2.2.0到2.2.8),作者好像是Steffen。
    (2) 在http://fastcgi.coremail.cn/index.cn.htm(现在无法访问了)上也有一个mod_fcgid,作者的信息我只在ChinaUnix找到一个帖子http://bbs3.chinaunix.net/thread-320106-1-1.html,有人说跟上面的是同一个,但因为网站无法访问,所以没有办法看到。
    (3) 最后一个就是你写的mod_fcgid了,官方地址是http://httpd.apache.org/mod_fcgid/,现在的版本是2.3.4,详细文档地址是http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html。
    因为想在实际的项目中使用mod_fcgid加载PHP,所以还望解答我的疑问,非常感谢!
    顺颂商祺!
    马志勇 (Jet Ma)
    =========================
    Hi, 马先生
    (1)其实是专门维护Windows版Apache的一位外国朋友做的,源代码也是来自标准的mod_fcgid, 不过Steffen维护的是Windows版的编译好的mod_fcgid.so,方便大家直接使用(Windows很多人没有安装编译工具,直接给源代码大家基本上没多少人可以用的上)
    (2) 之前做mod_fcgid的时候,代码和文档一直放在这里的,但是后来代码捐献了给Apache之后,这里就不再维护了,另外最近公司服务器做了一些调整,我也改不了redirect到apache网站了
    (3) 这是当前官方的mod_fcgid, 维护的是最新最稳定的mod_fcgid, Apache软件基金会的程序员(我也是其中之一)正在维护这个项目,如果您有什么问题,可以直接在Apache的邮件列表提出的(不过使用问题最好不要在开发邮件列表提出了)

    Thanks

    参考资料:
    mod_fastcgi和mod_fcgid的区别
    Windows 下 Apache 1.3 以 FastCGI 模式运行 PHP

    Subversion和Apache的安装使用指南

    Filed under: JavaPlateform,Web&Server — Jet @ 5:21 上午
    原文出处: Subversion和Apache的安装使用指南
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    虽然Subversion(SVN)直接可以注册为服务程序,但是最方便的还是使用SVN+Apache的方式,因为可以无防火墙限制、方便直接使用浏览器对代码进行浏览等等。下面我就将自己在Windows下安装Subversion(SVN)和Apache的方法记录一下:

    1. 从Apache网站上下载Apache的安装包进行安装,这个过程比较简单。需要注意Apache的版本,本文采用2.2,当然也可以使用2.0版本。假定Apache的安装目录为D:\apache2。

    2. 在http://subversion.tigris.org/官方下载Subversion的Windows下面与Apache的配合版本,这里需要注意Apache的版本,2.0和2.2的是不一样的,不要下载错了。

    然后将下载下来的zip包解压缩到一个目录,比如D:\svn-win32-1.6.6。

    3. 将svn安装目录的bin目录下面的mod_authz_svn.so和mod_dav_svn.so两个文件拷贝到Apache安装目录的modules目录下面,然后修改Apache的配置文件httpd.conf,将下面两行的注释去掉:

    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule dav_module modules/mod_dav.so

    同时在下面增加两行:

    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so

    4. 接下来就是对SVN进行配置了,配置文件(包含每条的含义)如下:

    # 表示访问SVN的地址,形式为http:///svn
    <Location /svn>
    # 告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块
    DAV svn
    # 在Subversion 1.3及更高版本中,这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库
    SVNListParentPath on
    # 下面制定SVN仓库的位置,有两种选择:
    # (1) 单库:一个Apache下面只有一个SVN仓库,这样的话就使用SVNPath来指定唯一的仓库位置,访问仓库的方式是http:///svn
    # (2) 多库:一个Apache下面可以有多个SVN仓库,这样的话就使用SVNParentPath来指定所有仓库所在的主目录,访问仓库的方式是http:///svn/仓库1、http:///svn/仓库2等等
    SVNPath “D:\Data\SVNData\repository”
    #SVNParentPath “D:\Data\SVNData\repository”

    # 当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
    AuthName “Subversion repositories”
    # 启用基本的验证,比如用户名/密码对,通常来做这样做就已经足够了。
    AuthType Basic
    # 指定密码文件的位置,密码文件中存放了用来验证用户的用户名和密码信息。这个文件的生成方式在后续步骤中会介绍
    AuthUserFile “D:\Data\SVNData\config\passwd”
    # 对版本库和人员进行权限分配,后面会进行详细的设置和介绍。
    AuthzSVNAccessFile “D:\Data\SVNData\config\svnaccessfile”

    # 限定用户只有输入正确的用户名及密码后才能访问这个路径
    Require valid-user
    # 如果想匿名读取的话使用下面的方式
    #<LimitExcept GET PROPFIND OPTIONS REPORT>
    #Require valid-user
    #</LimitExcept>
    </Location>

    5. 接下来使用Apache中的htpasswd.exe命令来生成密码文件,也就是上面AuthUserFile 设置项所指向的文件,切换到Apache安装目录的bin目录下,指向下面的命令:

    # 后面的参数c表示新建文件,在第一次执行的时候使用
    htpasswd -c D:\Data\SVNData\config\passwd <username>
    # 如果是追加新用户或修改原有用户密码,命令后面不加参数c
    htpasswd D:\Data\SVNData\config\passwd <username>

    每次执行命令之后会提示输入两遍密码

    6. 这个时候如果重启Apache的话会出现一个错误提示,这个是因为svn所使用的一些dll文件apache还无法获取,解决的方法可以将svn安装目录的bin目录下面的dll文件拷贝到系统的system32目录下面,但最好的方式是将bin目录加入到path环境变量中。

    7. 这个时候如果访问http:///svn的话,应该会出现一个登录框,输入用户名/密码之后就可以看到SVN仓库的内容了。不过常见下面的几个错误:
    (1) 出现“403 Forbidden”错误
    出现这个错误的原因有很多种,比如Apache2.2相对于之前的版本来说增强了安全性,默认情况下目录是禁止访问的,将“<Directory />”修改如下:

    <Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    </Directory>

    如果这样还不行的话那就是“多库还是单库”的问题了。上面讲过,在对SVN进行配置的时候,使用SVNParentPath设置所有库的根目录,在根目录下面存放多个SVN的库,那这样的话直接访问父目录是没有权限的,只能通过http:///svn/project1来访问对应的项目仓库;如果使用SVNPath设置为单库的话则不会出现这个错误了。

    (2) 出现“<m:human-readable errcode=”720003″>Could not open the requested SVN filesystem</m:human-readable>”错误
    出现这个错误是告诉你你所指定的SVN仓库的位置并不是一个合法的SVN仓库,解决的方法是首先创建一个空目录,然后使用“svnadmin create”命令来创建SVN库:

    # 首先进入 D:\Data\SVNData\repository 目录下
    md project1
    svnadmin create D:\Data\SVNData\repository\project1

    8. 最后安装SVN客户端就可以访问啦,Eclipse集成的客户端推荐使用Subclipse,Visual Studio集成的客户端推荐使用ankhsvn,系统集成的客户端推荐使用TortoiseSVN

    参考资料:
    [翻译] windows安装基于Apache的SVN服务器(包括SSL配置)
    基于svnserve的服务器,权限文件authz配置的常见问题及解答
    Forbidden access or bad repository ?
    Subversion for Windows 安裝指南

    Apache+Resin下如何写伪静态和301跳转

    Filed under: SearchEngine,Web&Server — Jet @ 7:19 下午
    Tags: , ,
    原文出处: Apache+Resin下如何写伪静态和301跳转
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    目前网上大多数资料都是介绍如何在Apache中设置伪静态的,在Resin中很少提及,经过实践实现了这一点,现在做如下总结。

    1. Apache下如何写伪静态和301重定向
    直接上代码(以本站域名为例):

    1. <IfModule mod_rewrite.c>
    2.     RewriteEngine On
    3.     # 叹号表示非,L表示最终结果,不再循环;NC是不区分大小写。
    4.     RewriteCond %{http_host} !^www.javatang.com [NC]
    5.     RewriteRule ^/(.*)$ http://www.javatang.com/$1 [R=301,NC,L]
    6.     RewriteRule ^(.*)/index(.*)$ $1/index.html [R=301,NC]
    7.   </IfModule>

    2. Resin下如何写伪静态和301重定向
    Resin下的重定向也是由伪静态来写的,不过具体一些的话他同页面伪静态是分别由两个tag来完成的,页面伪静态由forward完成,301永久重定向由moved-permanently完成。

    下面是具体的代码:

    1. <rewrite-dispatch>
    2.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
    3.         <!-- HTTP 301 moved -->
    4.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
    5.     </rewrite-dispatch>

    这里需要特别注意的一点就是地址中的QueryString中&连接符需要使用&来代替,否则为出现错误。

    因为JavaEE默认的web.xml文件不支持上述属性,所以可以在你的站点WEB-INF目录下创建一个resin-web.xml文件,这个文件会被Resin看作为站点配置文件,然后在文件中写下如下内容:

    1. <web-app xmlns="http://caucho.com/ns/resin"
    2.          xmlns:resin="http://caucho.com/ns/resin/core">
    3.     <rewrite-dispatch>
    4.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
    5.         <!-- HTTP 301 moved -->
    6.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
    7.     </rewrite-dispatch>
    8. </web-app>

    3. Apache+Resin组合的时候设置伪静态需要注意的地方

    二者组合中Resin主要完成Servlet所映射的地址为文件类型,而Apache完成其余部分,因此关于页面伪静态部分需要在Resin和Apache中同时设置才有效,否则有时候会出现404错误。但对于301永久重定向来说,如果是涉及域名部分的只需要在Apache中设置即可,如果二者都设置的时候会出现域名解析错误;如果涉及到页面部分的话需要在二者中都设置。

    关于Resin如何同Apache组合请看这篇文章 Resin 3.0.x 经验总结

    关于Resin+Apache下如何设置泛域名请看这篇文章 Apache+Resin泛域名的设置

    参考资料:
    Resin url rewrite tags
    Apache网站301永久重定向设置

    Apache+Resin泛域名的设置

    Filed under: Web&Server — Jet @ 3:25 下午
    Tags: ,
    原文出处: Apache+Resin泛域名的设置
    作者: 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 出错造成站点无法访问

    Filed under: Web&Server — Jet @ 3:17 上午
    原文出处: Zend Optimizer 出错造成站点无法访问
    作者: 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性能优化

    Filed under: Web&Server — Jet @ 3:08 上午
    Tags: ,
    原文出处: Windows NT系统下的Apache性能优化
    作者: 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高占用率的问题

    Filed under: Web&Server — Jet @ 10:06 下午
    Tags: ,
    原文出处: 解决Apache出现的CPU高占用率的问题
    作者: 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%时间过长,如何优化程序

    下一页 »