windows下apache的ThreadsPerChild和Win32DisableAcceptEx参数的相关问题

这几天喻名堂的公司有一个用Apache搭建的web服务器老是在早上6点多钟的时候访问不了,就像没有搭建过PHP环境一样的,后来在错误日志里面发现有如下错误:

[Sat May 26 06:32:20 2012] [warn] Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
[Sat May 26 06:32:43 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
[Sat May 26 06:32:43 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.

第一个错误看字面意思比较好理解,就是线程用完了,建议增加线程数,这就是导致Apache访问不了的问题所在了,但是为什么会有“指定网络名不再可用”这样的错误呢,而且是疯狂的写这样的日志,导致错误日志文件都很大。于是在网上搜索了相关的解决办法,首先当然是要在Apache的httpd.conf文件中配置ThreadsPerChild参数来增加Apache的线程数,然后在Apache的httpd.conf文件中加上Win32DisableAcceptEx参数。具体添加的内容如下:

  1. <IfModule mpm_winnt.c>    
  2. ThreadsPerChild 150    
  3. MaxRequestsPerChild  1000    
  4. Win32DisableAcceptEx    
  5. </IfModule>  

这里对上面的各个参数做一下解释:ThreadsPerChild参数就是设置Apache的线程数,我这里设置的150,为什么要设置为150在后面会有解释;MaxRequestsPerChild参数是设置Apache的是大线程数,当Apache使用的线程超过这个数的时候Apache就会自动重启;设置Win32DisableAcceptEx参数是为了解决“指定的网络名不再可用”的问题的,原因是apache在某些Windows版本上可能兼容性不足,在调用AcceptEx接收请求时可能有问题,只在APAche2.0.49以上版本会有这中问题。 《Apache 2_2 中文版参考手册》上说:“AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。如果你遇到类似于如下 的错误:一般的解决办法是关闭 AcceptEx()”。也就是说,可能是 Windows Update 或是防火墙、防毒软件更新了某些网络原件,造成 Microsoft WinSock v2 API 动作不正常,会干扰WinSock2 API,就会影响AcceptEx()的正确操作,就可能出现上面所出现的问题。但是关闭会影响Apache的性能,喻名堂这里设置后的主要表现就是内存的占用量会明显的增加,而且在用F5不断刷新页面的情况下内存的占用量还会飞快的增长,直到Apache的线程数达到最高上限重启。不过经过进一步的搜索和实验,只要把Apache的线程数设置在170以下,这种情况就不会出现,不管怎么刷新网页Apache的内存占用量都会维持在115M左右,停止刷新又会慢慢回到30多M。当然这只是在喻名堂的服务器上的测试结果,并不能代表全部。

另外在网络上搜索到在Apache的配置文件里面添加Win32DisableAcceptEx参数以后还是会出现“指定的网络名不再可用”,网上提供了如下进一步解决办法:

1、网上邻居-;本地连接-;属性-;internet协议(TCP/IP)-;属性-;高级-;wins标签-;去掉启用LMhosts查询前的勾.

2、控制面版-;windows防火墙-;高级标签-;本地连接设置-;服务的标签里勾选安全Web服务器(HTTPS)。

3、然后退出Apache,再打开启动就可以了 ,一定要先停止,在开启即可。

以上进一步解决办法喻名堂也一并用了,因为是今天设置的,所以还不能测试到这样设置到底有没有用,结果只能等到明天才能知道了。请继续关注我的博客,或者订阅我的博客

发表评论

电子邮件地址不会被公开。 必填项已用*标注