真实踩坑经历:从“一切正常”到“页面白屏”
上周二下午三点,我正摸鱼刷手机,突然接到老板微信:“公司官网打不开了!” 我点开浏览器,输入域名,等了十秒,只看到一个白屏和浏览器左下角“正在等待响应”的小字,当时后背瞬间就湿了——咱负责的可是电商站,这一秒的损失都是钱啊!
宝塔面板实时请求假死之谜,别让服务器成了聋子的耳朵
我赶紧登录服务器,宝塔面板倒是能打开,但首页的“实时请求”监控区一片死寂,正常情况应该是一排排绿色、红色的请求记录像瀑布一样刷下来,现在却像被按了暂停键,点开“网站”菜单,状态显示“运行中”,点开“默认站点”,日志里最后一条请求还停留在两小时前,直觉告诉我——不是网站挂了,是宝塔面板自己“瞎”了。
报错截图描述:那些让老手都头疼的坑
我第一反应是重启面板,在SSH里敲了/etc/init.d/bt restart,面板秒起,但问题依旧,接着我看了眼磁盘负载:df -h 显示根目录已用100%!再敲 iotop,磁盘IO直接飙到98%,一堆php-fpm和nginx进程在疯狂写日志,像一群饿了三天的蚂蚁。
最经典的就是这张截图:
- 宝塔面板“实时请求”一片空白。
- 但用
netstat -anp | grep :80一看,TCP连接状态却是ESTABLISHED,数字还在跳。 - 用
curl -I http://localhost测试,返回502 Bad Gateway。
这意味着:面板以为服务器活着,但实际业务已经半身不遂。
排查思路:别被表象迷惑,先挖根因
当时我犯了新手错误:先怀疑面板bug,甚至想重装面板,还好立马冷静,想起老前辈的话:“面板是工具,不是上帝;实时请求停摆,先查系统底层,别碰面板配置。”
排障顺序应该是:
- 查磁盘(
df -h、du -sh /*):日志爆满、磁盘碎片、inode耗尽,是导致面板“假死”的头号元凶。 - 查负载(
top、iotop、free -m):CPU排队、内存不足、磁盘IO卡慢,都会让面板拿不到系统数据,自然显示不出请求。 - 查网络(
netstat、ping、traceroute):端口被占、防火墙误杀、DNS解析失败,让面板连接不到服务。 - 查面板自身(
bt 22查看面板错误日志):面板的Python进程崩溃、数据库连接超时等,但概率极低。
那天我按这个思路,第一步就找到了根因:/var/log 目录下,一个nginx access日志文件单日写到2.3GB,加上PHP慢日志和错误日志,直接把50GB的根目录塞爆。inode也在告警:df -i显示使用率99%,每个inode对应一个文件节点,连新文件都创建不了了,更别说写新日志。
解决方案:快准狠,三刀解决问题
第一刀:清理日志。
cd /var/log && find . -type f -size +500M -exec truncate -s 0 {} \;
注意是“截断”不是“删除”,不然进程会丢文件描述符,然后重启rsyslog和nginx。
第二刀:建立日志轮转机制。
在宝塔面板里,针对每个站点,开启“日志轮转”,设置按天或按100MB切割,保留7天,同时排查那些“沉默站点”——有些网站几个月没更新了,但仍在扫你的资源导致日志疯长,建议对这类站点临时关掉访问日志。
第三刀:扩容磁盘+监控告警。
买块云盘挂载到/www或/var,用ln -s软链接把日志路径移过去,然后在宝塔计划任务里加一个脚本,每天凌晨检查磁盘使用率,超过80%就发邮件报警,脚本我贴一下核心部分:
USAGE=$(df / | grep / | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt 80 ]; then
echo "磁盘已用$USAGE%" | mail -s "告警" your@email.com
fi
做完这三步,面板的“实时请求”瞬间恢复,日志像瀑布一样刷起来,网站访问秒开,整个过程从发现问题到恢复,用了22分钟——包括花10分钟冷静思考的时间。
预防建议:让你少走三年的弯路
-
日志不是攒着看的,是流着看的。
别等日志堆成山再清理,装个logrotate或直接用宝塔面板自带的日志轮转功能,设好压缩、切割、保留天数,那些日访问量不超过100的站点,直接关掉访问日志,省得每天写几百KB垃圾数据。 -
实时请求监控只是保健员,不是急救医生。
面板显示正常,不代表业务正常,建议额外装一个第三方监控(比如NodePing、UptimeRobot),每5分钟模拟一次真实用户请求,哪怕面板挂了,你手机也能收到短信报警。 -
磁盘inode比容量更危险。
很多新手只在意df -h,不关心df -i,一旦inode耗尽,你连touch test.txt都失败,更别说写日志、创建缓存文件,养成习惯,每个月查一次inode使用率,如果小文件多(比如缓存文件),就用find / -type f | wc -l统计数量,并用ls -la | wc -l确认每个目录下小文件是否超限。 -
不要天天盯着面板的实时请求“看它动”。
那玩意儿本质是WebSocket推送,服务器一卡,前端就停,如果你发现面板页面上的实时请求超过5分钟不动,请别犹豫,先SSH进去敲一行top,面板是窗户,不是地基,地基不稳,窗户再干净也白搭。 -
定期演练“面板逃逸计划”。
每年至少一次:关闭宝塔面板,尝试只用命令行重启Nginx、修改配置、拉取日志,当你发现即使面板全废,你也能徒手重建服务时,你才算真的掌控了服务器。
最后送大家一句话:宝塔面板是新手村的拐杖,不是副本里的铠甲。 实时请求停摆了,别慌,先查底层,再看面板,这招救了我无数个下午,也希望能救你一命。



发表评论