文章引用地址:
http://www.neo.com.tw/archives/000223.html
我電腦上的 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 ,動作果然都正常了。