我们有一个由 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) 来阻止此类攻击。