2008-10-02 221 views
4

我有一個使用CherryPy編寫的Web應用程序,它在127.0.0.1:4321上本地運行。我們使用mod-rewrite和mod-proxy來讓Apache充當反向代理; Apache也處理我們的SSL加密,並可能最終被用來傳輸我們所有的靜態內容。Apache套接字不關閉?

對於小型工作負載,這一切都可以正常工作。不過,我最近使用urllib2來編寫一個壓力測試腳本,可以模擬100個客戶端的工作負載。過了一段時間,每個客戶端從Apache獲得503錯誤,表明Apache無法連接到127.0.0.1:4321。 CherryPy的正常工作,但我的Apache的錯誤日誌顯示像下面幾行:

[Thu Oct 02 12:55:44 2008] [error] (OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted. : proxy: HTTP: attempt to connect to 127.0.0.1:4321 (*) failed

Google上搜尋這個錯誤表明阿帕奇可能已經用完了套接字文件描述符。由於我只有100個客戶端正在運行,這意味着連接沒有被關閉,可能是我的urllib2連接和Apache(我肯定在urlopen的返回值上調用.close())或Apache和CherryPy之間的連接。

我已確認我的urllib2請求正在發送HTTP Connection: close標頭,儘管如果重要的話,Apache配置爲KeepAlive On

在它的事項,我使用Python 2.5,Apache 2.2的,CherryPy的3.0.3和服務器在Windows服務器上運行的情況下,2003年

那麼,什麼是我的下一個步驟,制止這個問題?

回答

5

SetEnv proxy-nokeepalive 1可能會立刻告訴你,如果問題是Apache和CP之間的存活。有關更多信息,請參閱mod_proxy docs

+1

這立即解決了問題。萬分感謝! – 2008-10-03 15:16:15

5

您可以運行netstat命令並查看您是否有一堆處於TIME_WAIT狀態的套接字。根據您的MaxUserPort設置,您可能會嚴重限制可用端口的數量。另外,TcpTimedWaitDelay通常設置爲240秒,因此任何使用的套接字在4分鐘內都不能重用。

這裏有更多的好信息 - >http://smallvoid.com/article/winnt-tcpip-max-limit.html