不幸的是,在我们的服务器遭受一系列 DDoS 攻击后,我们不得不转而使用 KeepAlive。我运行的是网页游戏,所以页面通常很小,而且大部分是文本,因此多年来,关闭 KeepAlive 效果很好。经过一些快速的配置更改后,情况似乎没有太大变化(除了能够更好地处理 DDoS 攻击),服务器负载保持相当低,平均约为 0.50,内存使用率约为 10%(总共 24GB)。
但是,每天大约有一次,apache 会挂起,大约 15 分钟内不会响应。即使在一天中,有时页面也需要 5 秒钟才能加载,我注意到在 apache 状态中,记分板上只有 keepalive(读取)请求,没有等待连接、读取回复、关闭连接等,大约有 100 多个读取请求。然后它自己解决了。当这种情况发生时,它似乎是随机的,虽然它通常发生在一天中的繁忙时间,既不是服务器负载也不高,也不是 apache 用尽可用的请求槽。
我的配置更改如下:
ServerLimit 1024
MaxClients 1024
Timeout 2
KeepAliveTimeout 5
KeepAlive On
MaxKeepAliveRequests 100
MinSpareServers 100
MaxSpareServers 200
我希望有人对此有所了解,或者可以建议我可以检查哪些日志/流程来了解为什么会发生这种情况。
提前致谢。
编辑:如果这有帮助......
56 requests/sec - 116.2 kB/second - 2126 B/request
105 requests currently being processed, 154 idle workers
当天晚些时候我预计这个数字将会翻倍。
编辑 2:KeepAliveTimeout 从 5 更改为 2
编辑 3:刚刚又发生了。这次我正好在场,看到了。Apache 没有响应,也没有占用任何内存。127.0.0.1 有 250 个连接,这种情况从未发生过。Apache 重启后一切正常。很奇怪!
答案1
您可以执行或检查以下几件事:
- 我们遇到过类似的问题,Apache 1.3 没有正确关闭连接,导致它们永远存在,最终会填满所有客户端插槽。为了解决这个问题,我们只需在 cron 脚本中每天重新启动一次 Apache。您的问题听起来不一样,因为您提到它最终会消失,所以每天重新启动可能没有任何帮助。
- 我认为您的并发连接数永远不会达到“MaxClients”?
- 您的“KeepAliveTimeout”设置是什么?默认值为 15 秒,对于大多数网站来说,这个时间太长了,通常 1 或 2 秒效果更好(尤其是因为您的“Timeout”设置为 2)。
- 检查“netstat -an”以查找来自某个客户端的明显 DOS 迹象。我发现,当网站出现不明显的问题时,通常是由于某个客户端以每秒 20 个请求的速度持续攻击网站。检查以确保服务器带宽没有达到上限(如果您只有 10 Mbps 的连接,这很容易做到)。我使用提供商的在线带宽监控图表,但应该也有命令行方式可以做到这一点(ifconfig 可能会让您这样做)。有各种 Apache 或服务器级解决方案可以自动防止 DOS 攻击(无论是否无辜)。
- 在问题发生期间检查“top”,并查看 CPU、IO 和内存使用情况。确保您没有交换内存(如果内存使用率仅为 10%,则不应交换内存)。
- 说到内存……即使是 24GB RAM 的服务器,10% 的内存使用率似乎也很低。我有几台 RAM 为 1-4GB 的服务器,它们的内存使用率都在 75-90% 之间(不过其中大部分都在操作系统缓存中)。我想这取决于您的 Apache 设置和服务器使用情况。
- 确保应用程序层中没有其他死锁导致问题(如数据库)。例如,检查您的 Apache“服务器状态”页面,如果该页面加载速度很快,但您常用网站的页面加载速度很慢,那么问题可能不是出在 Apache 服务器上。
- 检查“/var/log”中的日志,特别是 Apache 错误日志和“消息”日志中的相关消息。如果您没有启用这些日志或其他应用程序日志,请至少暂时启用它们。
- 检查系统限制,例如一次允许打开的文件数 (ulimit -n)。许多服务器/操作系统的默认设置不一定针对高容量服务器进行配置。
- 如果所有其他方法都失败了,请质疑您对问题可能是什么的假设,并仔细检查“不可能”失败的项目或您已经检查过的项目。