我今天已经彻底解决了这个问题,但似乎找不到任何信息来确定到底发生了什么。
基本上,在我的开发服务器上,如果我不重新启动 apache2,另一个开发人员就会导致 CLOSE_WAIT 连接,从而占用一个或多个 apache2 进程几个小时。
对任何进程执行 strace 都不会产生任何信息,仅能表明它能够附加。
mod_proxy 未启用。
KeepAlive 已开启,KeepAliveTimeout 为 15 秒,MaxKeepAliveRequests 为 100。
从我所读的内容来看,这可能是也可能不是一个 Apache 问题,只是 CLOSE_WAIT 的工作方式就是这样(服务器正在等待 FIN 数据包来关闭连接)。
我简直不敢相信一台服务器会因为没有收到远程主机发送的关闭连接的数据包而如此轻易地瘫痪。尤其是在一个多小时内没有任何干预的情况下。
有什么建议吗?我快要拔掉我的头发了。
编辑 : 此外,任何 Apache 日志文件中都没有异常条目。
编辑2:lsof -i 每个挂起进程仅显示一个 CLOSE_WAIT。(这就是困扰我的地方,因为大多数其他讨论都谈到许多 CLOSE_WAIT 连接,而我每个进程只有一个。)
正在运行的代码 (php) 的性质实际上并不适合关闭打开的连接等。我可以使用相同的会话数据运行他正在执行的相同代码,而不会导致挂起进程。
答案1
尝试设置 mod-status,并在配置(debian /etc/apache2/mods-enabled/status.conf)中将你的 IP 设置为允许来自,然后设置
ExtendedStatus On
然后访问服务器的默认主机网站,并将 /server-status/ 附加到 URL 末尾。这样您就可以了解有关服务器正在运行的更多信息。
抱歉,这并不是真正的解决办法,而是一种获取更多信息的方法!我无法直接评论您的问题。
答案2
看运行 lsof -i 显示很多连接处于 CLOSE_WAIT 状态?我应该担心吗以及类似的讨论。可能你的开发人员没有正确关闭连接。CLOSE_WAIT 在正常情况下应该超时,但有某种原因阻止了它。
您可以尝试回滚到没有此错误的应用程序版本,然后查看其间发生了什么变化。