Apache套接字无法关闭?

时间:2020-03-06 15:02:23  来源:igfitidea点击:

我有一个使用CherryPy编写的Web应用程序,该应用程序在127.0.0.1:4321上本地运行。我们使用mod-rewrite和mod-proxy来使Apache充当反向代理。 Apache还处理我们的SSL加密,并且最终可能会用于传输我们的所有静态内容。

对于小型工作负载,这一切都很好。但是,我最近使用urllib2编写了一个压力测试脚本,该脚本可以模拟100个客户端的工作负载。一段时间后,每个客户端都会从Apache收到503错误,表明Apache无法连接到127.0.0.1:4321. CherryPy正常运行,但是我的Apache错误日志显示了以下内容:

[2008年10月2日星期四12:55:44] [错误](OS 10048)通常,每个套接字地址(协议/网络地址/端口)仅允许使用一种。 :代理:HTTP:尝试连接到127.0.0.1:4321(*)失败

谷歌搜索此错误表明,Apache可能已用完套接字文件描述符。因为我只有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 Server 2003上运行。

那么,解决该问题的下一步是什么?

解决方案

我们可以运行netstat命令,查看是否有一堆套接字处于TIME_WAIT状态。根据MaxUserPort设置,可能会严重限制可使用的端口数。另外,TcpTimedWaitDelay通常设置为240秒,因此使用的所有套接字都无法在四分钟内重用。

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

如果Apache和CP之间的问题仍然存在,SetEnv proxy-nokeepalive 1可能会立即告诉我们。有关更多信息,请参见mod_proxy文档。