我按照 howtoforge 教程设置了一个 centos 服务器。它运行正常,但我注意到一些问题,不知道如何解决。
我打开 Google Chrome,打开我的网站,然后按住 F5(刷新页面),这会让浏览器向服务器发送很多请求。
我检查了日志文件,发现有数十、数百个相同的 url 请求来自我的 ip。它甚至不显示 .js .css 或图像文件之类的请求。只有我刷新的地址和几行一行接一行的内容,就像下面的一样。
这导致服务器完成所有操作后没有响应。
我尽量减少对 mysql 的 sql 查询,几乎所有数据都来自 APC 缓存。我启用并检查了 mysql 查询日志,它每页显示仅运行 2-3 个查询。其余来自 APC。
top 命令在此期间不会显示服务器的高负载,但会显示许多 apache 进程。
我该如何解决这个问题?有没有办法限制/阻止每个 IP 不请求这么多相同的 URL。
192.168.162.191 - - [06/Sep/2013:12:26:29 +0300] "GET /en/page1 HTTP/1.1" 200 10084 "http://domain.com/en/page1" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
编辑1
我按住 F5 5 秒,然后就发生了这种情况。服务器负载通常为零。服务器上没有人。
页面生成时间为 200ms
顶部输出
top - 08:23:00 up 41 days, 11:32, 1 user, load average: 0.12, 0.05, 0.01
Tasks: 490 total, 2 running, 488 sleeping, 0 stopped, 0 zombie
Cpu(s): 27.9%us, 5.6%sy, 0.0%ni, 66.5%id, 0.0%wa, 0.1%hi, 0.0%si, 0.0%st
Mem: 2979104k total, 2141960k used, 837144k free, 178948k buffers
Swap: 3112952k total, 14112k used, 3098840k free, 775020k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18293 web1 20 0 146m 27m 16m R 83.9 1.0 0:02.96 php-cgi
25247 mysql 20 0 213m 57m 4996 S 22.9 2.0 3:34.66 mysqld
18465 web1 20 0 143m 22m 13m S 9.3 0.8 0:00.28 php-cgi
18467 web1 20 0 143m 22m 13m S 9.3 0.8 0:00.28 php-cgi
18431 web1 20 0 143m 22m 13m S 4.6 0.8 0:00.14 php-cgi
31704 apache 20 0 25204 3648 708 S 1.3 0.1 0:01.10 httpd
31701 root 20 0 151m 20m 11m S 1.0 0.7 0:02.34 httpd
18295 root 20 0 2836 1304 864 R 0.7 0.0 0:00.13 top
9 root 20 0 0 0 0 S 0.3 0.0 0:12.50 ksoftirqd/1
1378 root 0 -20 0 0 0 S 0.3 0.0 5:12.68 iscsi_q_30
18200 apache 20 0 151m 13m 4668 S 0.3 0.5 0:00.01 httpd
18330 apache 20 0 151m 13m 4676 S 0.3 0.5 0:00.01 httpd
1 root 20 0 2900 1316 1164 S 0.0 0.0 0:05.91 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:26.73 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 5:01.34 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
输出为ps uax | grep httpd | wc -l
238 。空闲时约为 20。
答案1
请提供以下信息:
页面生成时间
输出:
top
和
ps uax | grep httpd | wc -l
(如果你使用 Debian,也许你需要用 apache 替换 httpd)在出现问题的时候
答案2
如果您的设置未调整,则只需按 F5 即可对 apache + php/mysql 进行 ddos 攻击。
使用 mysqltuner 或 mysql tuning primer 等 mysql-tuning-script 检查 mysql 并进行相应调整
检查 apache 错误日志
使用 mod_evasive 防止你的服务器被意外攻击
使用 top/htop (针对 os)、atop (针对 apache) 和 mytop (针对 mysql) 来调查瓶颈
调整 -> 检查 -> 调整 -> 检查 -> 调整 -> 检查 -> 快乐:)