跟踪/解决 Apache2 中的突发峰值

跟踪/解决 Apache2 中的突发峰值

我的服务器运行在 Ubuntu20.04 上,这是一个纯 LAMP 堆栈,带有 Apache 2.4.41。在过去的几周里,总共发生了 2 次 Apache2 没有响应的情况(用户无法加载我们的网站),我们无法解决原因,但在我重新启动 Apache2(systemctl restart apache2)后,它又开始工作了。我检查了一下,MySQL 已经启动了,所以我觉得这纯粹是因为 Apache2 达到了极限并且没有响应。

因此我开始跟踪并记录进程数,即记录以下命令

ps aux | grep apache | wc -l

每 5 秒写入一个文本文件。

该命令将返回带有“apache”一词的进程数,其目的是告诉我们当前活动进程的数量。

通常进程数范围为 90(非高峰期)至 250-300(高峰期)。但偶尔(自我们开始记录以来,已经两次了)会上升到 700,趋势将是 90 > 180 > 400 > 700,几乎每 5 秒翻一番。

我检查了 apache 错误日志、系统日志、访问日志等,没有找到任何有用的信息。最初我怀疑这是一个 DDOS,但我没有找到任何有用的信息来“证明”这是一个 DDOS。

关于我的服务器配置的一些信息 -

  • 使用默认的 mpm_prefork
  • 最大保持活动请求数 100
  • KeepAliveTimeout 5
  • 服务器限制 1000
  • MaxRequestWorkers 1000(最近增加以“解决”峰值问题,之前是 600)
  • 每个子节点的最大连接数 0
  • 最大备用服务器数 10
  • 未启用防火墙(ufw)或 mod_evasive。

我的问题是,

  1. 如果根本没有日志,有什么方法可以找出导致峰值的原因吗?我觉得这是由于某些 Apache 进程卡住并不断产生子进程,如果是这样的话(抱歉,我对服务器的东西不太熟悉)。

  2. 我注意到,在出现峰值后,进程数不会立即下降,相反,似乎每 5 秒就会减少 3-5 个进程,并且需要大约 9-10 分钟才能从 700 个进程减少到 100 个进程,不知道原因是什么,但我应该调整哪个配置以使进程更快地“死亡”?我希望,如果进程“死亡”得足够快,即使突然出现峰值,我的服务器也只会“停机”最多 5-10 秒。但读了一些资料后,我将 KeepAliveTimeout 设置为 5 应该足够快地将其杀死,为什么它会持续长达 10 分钟?我应该将 MaxConnectionsPerChild 设置为 0(无限制)以外的值吗?

我目前的方法是希望找到实现 #2 的方法,并“证明”在高峰期间进程死亡速度比以前更快。其次,如果真的是 DDOS,也许可以实施防火墙来防止 DDOS。

谢谢

相关内容