目前这是我运行 top 时得到的结果
Tasks: 151 total, 2 running, 149 sleeping, 0 stopped, 0 zombie
Cpu(s): 74.1%us, 1.3%sy, 0.0%ni, 43.6%id, 0.0%wa, 0.0%hi, 0.3%si, 3.6%st
Mem: 4045608k total, 3447088k used, 598520k free, 13588k buffers
Swap: 131068k total, 0k used, 131068k free, 387916k cached
3569 www-data 20 0 349m 72m 14m S 14 1.8 1:49.47 apache2
3572 www-data 20 0 349m 72m 14m S 14 1.8 1:47.16 apache2
3611 www-data 20 0 348m 70m 13m R 14 1.8 1:43.37 apache2
3565 www-data 20 0 349m 71m 13m S 13 1.8 1:45.07 apache2
3608 www-data 20 0 349m 73m 14m S 13 1.9 1:45.83 apache2
3550 www-data 20 0 349m 71m 13m S 13 1.8 1:49.43 apache2
3574 www-data 20 0 349m 72m 14m S 13 1.8 1:42.73 apache2
3602 www-data 20 0 349m 71m 13m S 13 1.8 1:40.62 apache2
3603 www-data 20 0 349m 71m 12m S 12 1.8 1:44.38 apache2
3561 www-data 20 0 349m 72m 14m S 12 1.8 1:45.13 apache2
3564 www-data 20 0 349m 72m 14m S 12 1.8 1:44.19 apache2
3531 www-data 20 0 349m 72m 14m R 6 1.8 1:43.68 apache2
3543 www-data 20 0 349m 72m 14m R 6 1.8 1:46.76 apache2
3604 www-data 20 0 349m 72m 14m S 2 1.8 1:44.09 apache2
3549 www-data 20 0 343m 66m 14m R 2 1.7 1:45.05 apache2
3052 mysql 20 0 2361m 83m 11m S 1 2.1 0:22.64 mysqld
1 root 20 0 24332 3224 2316 S 0 0.1 0:00.95 init
查看日志文件似乎确实达到了 maxClients,但我不知道这是怎么发生的,因为没有人在查看该网站。当前的 apache 配置如下:
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 6
MaxSpareServers 12
MaxClients 50
MaxRequestsPerChild 3000
</IfModule>
这只是随机开始发生的,没有更新,没有变化。
答案1
虽然有很多方法可以解决这个问题,但我找到了一个老问题在 ServerFault 上建议一条简单的 iptables 规则
iptables -I INPUT -p tcp --dport 80 \
-m connlimit --connlimit-above 20 --connlimit-mask 40 -j DROP
答案2
您可以使用它apache2ctl fullstatus
来获取远程客户端的完整列表以及他们正在查看的 URL。编辑:说清楚点,我说的是 Apache 的 mod_status。加载后,您可以(在终端中)发出上述命令来获取 Apache 状态的详细转储。
如果您检测到一种模式(例如:从单个远程 IP 打开了太多连接),您可以使用 fail2ban 来阻止请求的客户端。