Day 2468 Apache Win32DisableAcceptEx

前阵子以及今天,单位的两台使用Apache的服务器相继在error log里冒出10038错误「在一个非套接字上尝试了一个操作」的记录,前一台服务器在按照重置Winsock之后成功解决,后一台因为需要保持其上运行的一些应用在线,所以想尽量保持服务器开机状态,于是上网找方法。
一番搜寻后,基本上都是如下的解决方案(这次百度居然也不是只有垃圾回答了;另外文章里出现的排版错误和书写错误都没有修改,「尊重」原文):

  在网上查了一下,发现很多人碰到这个情况,原因是Apache 的AcceptEx在window下会出现这种问题,只在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的性能。需要自己权衡利弊。因此如果没有什么 错误发生,最好还是不要随便关闭这个功能比较好吧。
解决办法:在httpd.conf文件中添加 Win32DisableAcceptEx 标记,如下:
<IfModule mpm_winnt.c>
ThreadsPerChild 1000
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>
这样可以允许并发连接更大一些。同时性能上也不会有明显的降低. 一般,这样设置基本就能搞定,但是我碰到的情况,就是想上面那样关闭AcceptEx,也会出现类似问题,Apache还是不能正常运作, error.log 出项了大量的:Sat Dec 24 17:21:28 2006] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.。又找了一下,发现了如下的一种解决办法,我试了试,果然可以,而且在多台服务器上试过,只要出现了AcceptEx 的问题,就能解决,具体设置为: 1、网上邻居-;本地连接-;属性-;internet协议(TCP/IP)-;属性-;高级-;wins标签-;去掉启用LMhosts查询前的勾. 2、控制面版-;windows防火墙-;高级标签-;本地连接设置-;服务的标签里勾选安全Web服务器(HTTPS)。 3、然后退出Apache,再打开启动就可以了 ,一开始我没有退出,直接在那重启,就是不可以,一定要先停止,在开启即可。

不过这样修改之后并没有解决问题,连后面对本地连接和防火墙的修改也做了。疑惑之下,为了尽快处理,还是使用netsh winsock reset解决了问题。

注:所有评论将在审核通过后显示,请不要在评论内容的任何位置出现链接,否则您的评论将被自动移入回收站,且永远不会被复审。

All comments will be available after being manually reviewed, please do not include any links anywhere in your comment, otherwise your comment will be automatically deleted and are not eligible for review.

3 条评论

  1. 建服务器还是在linux下比较好,而且apache、php、mysql在linux下要比windows下更实在。防火墙之类的软件干扰也比较少。

    1. 我也是这么想的,只是同服务器下还有Windows架构的服务要跑,所以比较没办法。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注