Apache 關閉 AcceptEx() 的時機 (Windows 適用)

php BB 大部分皆是由竹貓星球提供資料!
頭像
懸壺子
系統管理員
系統管理員
文章: 29924
註冊時間: 2001-10-05 , 10:10
個人狀態: 道骨學習佛心..^^..
貼心留言: 氣候不穩
性別: 公仔
來自: 黃金故鄉
聯繫:

Apache 關閉 AcceptEx() 的時機 (Windows 適用)

文章: #49890 懸壺子
2007-01-01 , 22:18

http://www.neo.com.tw/archives/000223.html

http://blog.chweng.idv.tw/archives/118/

Apache 關閉 AcceptEx() 的時機 (Windows 適用)
我電腦上的 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 。\r

Win32DisableAcceptEx 顧名思義就是在 Windows 下關掉 AcceptEx() 功能的指令。至於 AcceptEx() 這個東西是什麼,可以參考 Apache 的官方網頁:

http://httpd.apache.org/docs-2.0/mod/mp ... leacceptex

原文如下:
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)。
n關掉 AcceptEx() 的方式只要在 httpd.conf 找到 <IfModule mpm_winnt.c> 區段,加入 Win32DisableAcceptEx 就可以了。

<IfModule mpm_winnt.c>
Win32DisableAcceptEx #加入這一行
ThreadsPerChild 250
MaxRequestsPerChild 0
</IfModule>

然後重新啟動 Apache ,動作果然都正常了。

回到「php BB2」

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客