我電腦上的 Apache 版本是 2.0.49,這陣子只要一重機開機,有時 CPU 的資源就被 Apache 給佔走了,而且硬碟的燈一直在閃。
今天因為開始要撰寫 WaShop 專案了,所以大概看了 Log 開始發生問題的區段是:
[Tue Jun 15 12:03:15 2004] [error] (OS 10038)嘗試操作的對象不是通訊端。 : Child 1556: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.
依照上面的訊息,關掉防火牆跟防毒軟體還是一樣的狀況,後來依照他的提示要使用 Win32DisableAcceptEx 指令。
所以只要看到 Log 有寫 Win32DisableAcceptEx 或 AcceptEx failed 之類的字眼,就該把 AcceptEx() 關掉了,而關掉的方法就是在 httpd.conf 內加入 Win32DisableAcceptEx 。
Win32DisableAcceptEx 顧名思義就是在 Windows 下關掉 AcceptEx() 功能的指令。至於 AcceptEx() 這個東西是什麼,可以參考 Apache 的官方網頁:
http://httpd.apache.org/docs-2.0/mod/mpm_winnt.html#win32disableacceptex
原文如下:
AcceptEx() is a Microsoft WinSock v2 API that provides some performance improvements over the use of the BSD style accept() API in certain circumstances. Some popular Windows products, typically virus scanning or virtual private network packages, have bugs that interfere with the proper operation of AcceptEx(). If you encounter an error condition like:
[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.
you should use this directive to disable the use of AcceptEx().
主要是說這 AcceptEx() 是 Microsoft WinSock v2 API 一組提升網路效率 API 中的指令。而且在 Windows 上似乎蠻有可能出問題的。
註:可能為了效能還是預設為開啟 AcceptEx()
如果無預警的發生問題,我猜可能是 Windows Update 或是防火牆、防毒軟體更新了某些網路原件,造成 Microsoft WinSock v2 API 動作不正常,這時可以把這個功能先給關掉。
依照官方說明 , Win32DisableAcceptEx 這個功能,只有 2.0.49 版以後的才可以使用,所以我猜測 AcceptEx() 這個指令大概也是 2.0.49 才會開始支援(目前最新的就是 2.0.49)。
關掉 AcceptEx() 的方式只要在 httpd.conf 找到 <IfModule mpm_winnt.c> 區段,加入 Win32DisableAcceptEx 就可以了。
<IfModule mpm_winnt.c>
Win32DisableAcceptEx #加入這一行
ThreadsPerChild 250
MaxRequestsPerChild 0
</IfModule>
然後重新啟動 Apache ,動作果然都正常了。
4 comments On Apache 關閉 AcceptEx() 的時機 (Windows 適用)
The above directive turn off the advanced functionality and make Apache fall back to more basic (but slower) techniques.
請問!
我是用appserv-win32-2.5.7版本的
在httpd.conf 裡找不到
請問我要在哪加上呢?
謝謝
在 底下加入。
我的做法刚好相反,我的是因为有了Win32DisableAcceptEx 才报错,把Win32DisableAcceptEx 注释掉就没错了