【MW-Panel 老服务器负载 100% 排查与处理记录】
环境:
硬件 1核 CPU / 约2GB内存 / 60GB SSD
软件 OpenResty + PHP 5.3 + MySQL 5.7
网站:www.ceqmap.com
一、现象
MW 面板显示“负载状态 100%,运行堵塞”。
运行 uptime,严重时:load average: 2.74, 1.80, 1.30
1核服务器负载长期明显超过1,说明任务存在排队。
二、排查
1. 看实时负载: uptime
2. 看进程: top
当时内存、Swap、磁盘 I/O 无明显异常,但 PHP-FPM 进程较多,MySQL持续工作。
3. 看最近访问: tail -n 50 /www/wwwlogs/www.ceqmap.com.log
4. 统计高频 IP: tail -n 10000 /www/wwwlogs/www.ceqmap.com.log | awk
‘{print $1}’ | sort | uniq -c | sort -nr | head -20
5. 统计高频 URL: tail -n 10000 /www/wwwlogs/www.ceqmap.com.log | awk
‘{print $7}’ | sed ’s/?.*//’ | sort | uniq -c | sort -nr | head -20
6. 统计 User-Agent: tail -n 10000 /www/wwwlogs/www.ceqmap.com.log |
awk -F’“’ ‘{print $6}’ | sort | uniq -c | sort -nr | head -20
7. 只统计返回 200 的 IP: tail -n 10000 /www/wwwlogs/www.ceqmap.com.log
| awk ‘$9==200 {print $1}’ | sort | uniq -c | sort -nr | head -20
三、原因
大量爬虫集中访问论坛 PHP 动态页面,使 PHP-FPM 和 MySQL负载升高。
主要包括: GPTBot AhrefsBot meta-externalagent Amazonbot,
其中最近10000条日志中 Amazonbot 一度有575条请求。
四、处理
在 www.ceqmap.com 的 OpenResty/Nginx server 配置中加入:
阻止高负载爬虫,避免占用 PHP/MySQL
if ($http_user_agent ~*
“(GPTBot|AhrefsBot|meta-externalagent|Amazonbot)”) { return 403; }
保存配置后验证:
tail -n 1000 /www/wwwlogs/www.ceqmap.com.log | grep -Ei
‘GPTBot|AhrefsBot|meta-externalagent|Amazonbot’ | tail -20
正常应看到: HTTP 403 请求耗时基本 0.000
说明 OpenResty 已在进入 PHP/MySQL 前直接拦截。
五、结果
处理前: load average: 2.74, 1.80, 1.30
处理后
逐步下降: 0.49, 1.24, 1.19 1.23, 0.95, 0.99 最终: 0.32, 0.75,0.90
负载恢复正常。
六、以后再次出现“负载100%”
以下顺序:
1. uptime 看负载
2. top 看CPU、内存、PHP-FPM、MySQL
3. tail 日志看最近请求
4. 统计高频 IP / URL /
User-Agent 5. 确认爬虫后在 Nginx/OpenResty 层直接 403 6. 等几分钟再次
uptime
不要一看到负载100%就立即重装系统、恢复备份、升级 PHP 或更换 VPS。
结论:
服务器本身没有明显故障,主要是爬虫大量访问老论坛动态 PHP页面。通过 OpenResty 在 PHP/MySQL
之前拦截高负载爬虫后,1核服务器负载恢复正常。
备注: 本站老程序需要 PHP 5.3,不能因为负载问题随意升级 PHP。 |