Apache 每 2-3 周就会挂起一次,closed_wait 连接数会增加,直到重新启动

Apache 每 2-3 周就会挂起一次,closed_wait 连接数会增加,直到重新启动

我们有一个由 3 台服务器组成的集群,所有 3 台服务器上都运行着 weblogic 来托管网站。在 weblogic 之上,使用 Apache 作为负载均衡器。

去年我将 Apache http 服务器从 2.4.9 升级到了 2.4.29。升级前一切运行正常,但升级后每 2-4 周 Apache 就会挂起一次。网站无法访问,检查服务器时我们没有看到任何错误,事实上当 Apache 挂起时它也会停止记录。

我们监控发现,在问题发生之前,没有发现异常的内存使用情况,没有对网站的可疑请求类型,也没有发现任何可疑的进程在运行。

在网上搜索后,我发现问题可能与 MPM 配置有关。Apache 使用的是事件 MPM,但我发现事件 MPM 配置未在 apache 配置中声明,我认为在升级过程中默认配置已被旧配置替换。

因此,我们修改了 MPM 配置以使用以下事件 mpm 配置,并且此更改有效。我们在接下来的 6 个月内没有遇到此问题。

启动服务器 4 最小备用线程 256 最大备用线程 512 每个子线程 64 最大请求工作线程 2048 每个子连接数 0

我们认为它已经修复,但是现在 6 个月后 Apache 再次挂起,唯一的症状是,在接下来的 1 个小时内,closed_wait 连接数从 20 增加到 550,网站无法访问,apache 停止记录其 ssl 和错误日志,我们在不同的运行进程数据、内存使用中没有看到任何异常行为,在问题发生之前也没有看到任何可疑请求。

答案1

这是一个常见问题。CLOSE_WAIT 连接未被使用,但消耗了 Apache 资源。

不久前我遇到了关闭等待连接的问题。经过大量调查,这里是一些技巧,以防你需要它。

您需要将其添加到您的 Linux 服务器

vi /etc/sysctl.conf

#Added to fix close_wait connections
#recommended 30. Default 60
net.ipv4.tcp_fin_timeout = 30
#in seconds, time in which the close_wait connections will be removed
net.ipv4.tcp_keepalive_time = 60
  
###duration of a request in seconds# probes * intvl = time to process if the connection is still alive
net.ipv4.tcp_keepalive_intvl = 2
#number of retries to test the connection
net.ipv4.tcp_keepalive_probes = 2

此外,应用此操作后,您需要使用以下方法刷新对该文件的引用系统控制-p命令。

之后,您必须在代理传递中添加 keepalive=On 指令。

ProxyPass /home ajp://localhost:8009/home keepalive=On retry=5

这将有助于在处于 CLOSE_WAIT 状态一分钟后删除 close_wait 连接。Apache 在工作模式下使用线程,这些线程由操作系统处理,如果系统无法关闭它,则由系统来处理。

记得也重新启动整个 apache 进程。

PD:如果你使用的是 ipv4,这会有所帮助。不确定 ipv6

希望能帮助到你

答案2

它看起来像是使用 slowloris 等工具的“慢速 DoS 攻击”。在这种类型的攻击中,攻击者会尝试保持与服务器的合法连接处于活动状态(打开),直到服务器挂起。我们使用 SPA(https://www.cyberxnetworks.com/index.php?cmd=website&aid=242) 来阻止此类攻击。

相关内容