Apache套接字未关闭?

6 投票
2 回答
6096 浏览
提问于 2025-04-11 09:28

我有一个用CherryPy写的网页应用程序,它在本地的 127.0.0.1:4321 上运行。我们使用mod-rewrite和mod-proxy让Apache充当反向代理;Apache还负责我们的SSL加密,未来可能会用来传输所有的静态内容。

这些在小负载下都运行得很好。不过,我最近用 urllib2 写了一个压力测试脚本,模拟了100个客户端的工作负载。过了一段时间,每个客户端都从Apache那里收到了503错误,表示Apache无法连接到 127.0.0.1:4321。CherryPy运行正常,但我的Apache错误日志显示了类似以下的内容:

[Thu Oct 02 12:55:44 2008] [error] (OS 10048)每个套接字地址(协议/网络地址/端口)通常只允许使用一次。 : proxy: 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上。

那么,我接下来该怎么做才能解决这个问题呢?

2 个回答

5

你可以运行 netstat 命令,看看是否有很多连接处于 TIME_WAIT 状态。根据你的 MaxUserPort 设置,你可能会在可用端口数量上受到很大限制。此外,TcpTimedWaitDelay 通常设置为 240 秒,这意味着任何被使用过的连接在四分钟内不能再次使用。

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

6

SetEnv proxy-nokeepalive 1 这个命令可能会立刻告诉你,问题是不是出在 Apache 和 CP 之间的保持连接上。想了解更多信息,可以查看 mod_proxy 的文档

撰写回答