网站挂了的那一刻,绝大多数人的第一反应是重启。重启 Nginx、重启 PHP、实在不行重启服务器。这套动作有一半概率管用,但管用的那一次你也不知道为什么管用。下次它还会来,而且大概率挑你最忙的时候来。
我后来给自己定了条规矩:不管什么故障,都按固定的五层顺序往下查,每层只用一两条命令确认是或不是,绝不跳层。从上往下依次是网络层、网关层、应用层、数据层、系统资源层。这个顺序不是随便排的,它对应的是一次请求真正走过的路径。跳过任何一层,你都可能把上一层的症状当成这一层的病因,然后往完全错误的方向使劲。
第一层网络层,回答的是请求到底到没到服务器。dig 看解析对不对,curl 看端口通不通,云服务器的安全组、运营商的防火墙有没有放行。真事:有人查了两小时 PHP 配置,最后发现是安全组把 80 端口关了。这一层不先确认,后面全是白干。
第二层网关层,也就是 Nginx。用 curl 拿状态码,502 和 504 在这一层就能分家——502 是联系不上上游,504 是上游太慢。再往下翻 error.log,日志里的关键字基本直接点名问题,比任何猜测都准。
第三层应用层。PHP-FPM 活着不等于能干活,进程数被打满的时候新请求是排不上队的。看 FPM 池的状态、看 PHP error_log、看慢日志,判断到底是程序报错还是容量不够。这一层的坑在于,它经常是第四层和第五层问题的替罪羊。
第四层数据层。MySQL 一卡,上面三层全跟着慢。SHOW PROCESSLIST 抓现行,看是 Sleep 堆积还是 Query 排队,两种情况的处置方向完全相反。
第五层系统资源层,放最后看但其实最要命。到这层才掏 top、free、df。很多疑难杂症的根就在这:内存不够被 OOM 杀掉、磁盘写满、inode 耗尽。前四层怎么查都没结果时,答案八成藏在这一层。
#!/bin/bash
# 服务器故障五层自检:从上往下一层层排除,别跳层
DOMAIN="example.com"
LOG="/var/log/nginx/error.log"
echo "===== 第1层 网络层:解析与端口 ====="
dig +short "$DOMAIN"
curl -sS -o /dev/null -m 10 \
-w "http_code:%{http_code} 连接:%{time_connect}s 总计:%{time_total}s\n" \
"https://$DOMAIN/"
echo "===== 第2层 网关层:Nginx 状态与错误日志 ====="
systemctl is-active nginx
tail -n 200 "$LOG" | grep -E "connect\(\)|timed out|Permission denied|too big header|max_children" \
|| echo "近200行 error.log 无关键字,网关层未见异常"
echo "===== 第3层 应用层:PHP-FPM 存活与进程占用 ====="
systemctl is-active php-fpm 2>/dev/null || systemctl is-active 'php*-fpm' 2>/dev/null
ps -o rss= -C php-fpm 2>/dev/null | awk "{s+=\$1} END {printf \"进程数:%d 总内存:%.0fMB\n\", NR, s/1024}"
echo "===== 第4层 数据层:MySQL 连接状态 ====="
mysql -e "SELECT command, count(*) AS cnt FROM information_schema.processlist GROUP BY command;" 2>/dev/null \
|| echo "MySQL 连不上或未安装客户端"
echo "===== 第5层 系统资源层 ====="
uptime
free -m | head -n 2
df -h / | tail -n 1
df -i / | tail -n 1
dmesg -T 2>/dev/null | grep -i "killed process" | tail -n 3
脚本跑完,五层里哪一层先红了就先修哪一层。顺序不能倒过来走,因为上层的报错常常是下层问题的投影。比方说网关层报 502,真正的病因可能是第五层内存不够,PHP 进程被内核杀掉了——你要是只盯着 Nginx 配置改,改到天亮也改不好。
还有个容易忽略的细节:脚本里的 dmesg 需要 root 权限,普通用户跑不出来。用 sudo 执行,否则第五层最关键的 OOM 记录会被静默跳过,你会误以为系统资源一切正常。
重启是止痛药,不是治疗。真正省时间的是那套固定的排查顺序,它把凭感觉猜换成逐层排除,故障来了你不用慌,照着走一遍就知道该动哪里。这个系列后面 24 篇会把这五层里最常见的故障一个个拆开讲,你可以直接从现象翻到对应的那一篇。
A5创业网 版权所有