Day 2468 Apache Win32DisableAcceptEx

请注意:本页内容发布于 4450 天前,内容可能已经过时,请注意甄别。

前阵子以及今天,单位的两台使用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解决了问题。

Comments

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

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

发表回复

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

 剩余字数 ( Characters available )

Your comment will be available after auditing.
您的评论将在通过审核后显示。

Please DO NOT add any links in your comment, otherwise it would be identified as SPAM automatically and never be audited.
请不要在评论中插入任何链接,否则将被自动归类为垃圾评论,且永远不会被提交给博主进行复审。

*