第 17 章 · 实战故障排查手册
阶段 E工具书 · 随查随用工作中直接翻
这是整份站点最「实用」的一章:工作中遇到问题直接按分类查。每个故障 = 现象 → 判断命令 → 处置。全部命令在前 16 章都学过 —— 这里是它们的「战场用法」。
17.1排查总思路(五步法)
- 别慌,先看日志:journalctl -xe、/var/log 对应文件、服务自身日志 —— 80% 的答案在第一眼。
- 缩小范围:本机自测(curl localhost)排除外部因素 → 分层定位(第 8 章网络、第 10 章性能)。
- 查最近改动:昨天改了什么配置/装了什么软件/升级了什么 —— 八成故障源于变更。
- 最小复现:手动前台运行/单条命令复现,看报错原文。
- 修 → 验证 → 记录:修复后确认状态正常,并把根因写进笔记(第 16 章学习法)。
故障期间三条纪律
① 生产环境动手前先备份受影响配置;② 每一步操作可回退(记录原状);③ 拿不准就「停手 + 查文档」,别用更大胆的猜测扩大故障。
17.2开机与系统类故障
| 现象 | 判断与处置 |
| 开机进不了系统 / 卡在 grub | 重启进 grub 菜单选「高级选项→救援/恢复模式」;改坏的启动项用 grub-mkconfig(Ubuntu)/grub2-mkconfig(Rocky)重建;内核坏了用旧内核启动 |
| fstab 写错开不了机 | 救援模式/单用户模式挂载根分区 → 改回 fstab(第 3 章红线,备份救命的场景就在这) |
| 开机提示磁盘检查/文件系统错误 | fsck 修复:fsck /dev/sda1(先卸载);注意先备份,fsck 有风险 |
| root 密码忘了 | grub 编辑内核参数加 init=/bin/bash 或 rd.break 进入救援改密码(需 console 权限,云主机走 VNC) |
| 系统时间不对 | timedatectl set-ntp true 开 NTP 同步;timedatectl status 查看 |
| 语言/中文乱码 | export LANG=C.UTF-8 或 localectl set-locale;终端工具看日志乱码用 LANG=C |
17.3服务类故障
| 现象 | 判断与处置 |
| 服务起不来(Failed to start) | systemctl status 服务 → journalctl -u 服务 -n 50 → 前台手动跑;三连排查:端口/配置语法/权限(第 7.7 节) |
| 端口被占用 | ss -tlnp | grep 端口 找到占用进程 → 停掉或换端口;或 lsof -i :端口 |
| 改配置不生效 | 确认改对文件(有的服务用 include 目录)、命令 -t 验语法、systemctl reload(不是 restart 也行但 reload 更平滑) |
| 开机不自启 | systemctl is-enabled 服务;enable 后 reboot 验证;unit 文件放对目录(/etc/systemd/system/) |
| 服务反复重启(crash loop) | journalctl 看崩溃原因 → 大概率配置/依赖/权限问题;临时 systemctl stop 后前台运行复现 |
| 定时任务没跑 | 先手动执行脚本 → 查 cron 日志(Ubuntu /var/log/syslog grep CRON,Rocky /var/log/cron)→ 查环境变量与权限(第 7.6 节坑) |
17.4网络类故障
| 现象 | 判断与处置 |
| 公网连不上服务器 | 云安全组放行?→ 服务器防火墙?→ 服务监听?(第 8.9 节顺序) |
| ping 通但服务连不上 | 端口没监听 / 防火墙挡端口 / 服务绑错 IP(127.0.0.1 只本机)→ ss -tlnp 核实 |
| 域名解析不了 | dig 域名 → dig @8.8.8.8 对比 → 检查 resolv.conf/systemd-resolved(第 8.4 节) |
| SSH 连不上/慢 | ssh -v 看卡在哪一步;服务器 journalctl -u ssh -n 30;DNS 反查慢加 UseDNS no;防火墙丢包用 tcpdump port 22 |
| 服务器访问外网慢/不通 | ping 网关 → ping 8.8.8.8 → curl 外网;查路由 ip route;DNS 换国内/公共 DNS 试试 |
| 被 DDoS(连接暴涨) | ss -s 看状态分布;防火墙限速/封来源;上云盾/CDN;临时 iptables 限单 IP 连接数(进阶) |
| 网卡丢包/断流 | ip -s link 看 RX/TX errors/drops;检查网线/驱动 dmesg;eth0 速率 ethtool eth0 |
17.5存储与磁盘类故障
| 现象 | 判断与处置 |
| 磁盘满了 | df -h 定位分区 → du -sh 逐层找大头(/var/log、docker、备份最常爆)→ 清理/轮转(第 10.2 节) |
| inode 满了(明明有空间却写不进) | df -i 查看 → 小文件过多(邮件队列/缓存)→ 清理小文件 |
| 分区只读 | 文件系统错误自动只读保护 → 检查 dmesg → 卸载后 fsck(先备份,别硬写) |
| 新数据盘看不见 | lsblk 找盘 → 分区/格式化/挂载/fstab(第 3.7 节完整步骤) |
| 磁盘 SMART 报警 | smartctl -a /dev/sda 看 Reallocated/Pending 计数 → 立刻备份并计划换盘(物理机) |
| 删了文件空间没释放 | 进程仍占用:lsof | grep deleted → 重启该进程/服务后空间释放 |
17.6性能类故障
| 现象 | 判断与处置 |
| 负载高但不知道谁干的 | top 按 CPU 排(P)→ 按内存排(M)→ ps --sort=-%cpu;挖矿病毒特征:陌生进程 100%CPU |
| 内存不足/OOM 杀进程 | free -h → dmesg | grep -i oom → 加内存或限制服务内存(systemd MemoryLimit) |
| 磁盘 IO 瓶颈(iowait 高) | iostat -x 2 看 util/%util → iotop 找进程 → 优化查询/换 SSD |
| 网站变慢 | curl -w 分解耗时(DNS/连接/TTFB/下载)→ 看后端(PHP/DB)慢查询日志 → 看磁盘/网络瓶颈 |
| 连接数打满(too many open files) | ulimit -n 查看 → systemd 服务加 LimitNOFILE=65535 → 调整内核参数(进阶) |
17.7安全类故障(被入侵迹象速查)
| 现象 | 判断与处置 |
| CPU 莫名 100% + 陌生进程 | top 定位 → 查进程路径 /proc/PID/exe → 断外联 → 挖矿清除流程(第 9.8 节) |
| 登录会话里有陌生人 | who/w → last -i 查来源 IP → 立即 kill 会话并改密码/密钥(第 9.8 节) |
| 文件被加密/勒索提示 | 立即断网隔离 → 保留现场 → 从备份恢复 → 报警(如涉及勒索)并复盘入口 |
| 网站被挂马/跳转广告 | 找新增可疑文件(find -newer)→ grep 危险函数 → 清 Webshell → 修漏洞 → 改全部密码(第 9.8 节) |
| 莫名被大量爆破 | auth.log 统计来源 → Fail2ban 封禁 → 禁用密码登录(第 9.2 节) |
17.8备份与恢复(最后一道防线)
终端 · 最小可靠备份方案
# 配置文件备份(每天):
tar -czf /data/backups/etc_$(date +%F).tar.gz /etc/nginx /etc/php /etc/mysql /etc/ssh 2>/dev/null
# 数据库备份(第 11 章脚本 + cron)
mysqldump -u backup --single-transaction --all-databases | gzip > /data/backups/db_$(date +%F).sql.gz
# 站点数据:rsync 增量到异地(另一台机器/云盘)
rsync -avz --delete /data/web/ backup@backup-server:/backup/web/
# 异地 = 跨机房/云对象存储(只放本机=火灾/勒索一起没)
备份三原则
3-2-1 原则:3 份副本、2 种介质、1 份异地。且每月真的恢复演练一次(从备份把站点恢复到测试机)—— 没验证过的备份等于没有备份。
17.9高频故障速查总表(一屏速查)
| 症状一句话 | 第一命令 / 第一动作 |
| 什么都在变慢 | uptime + top + free -h |
| 服务起不来 | journalctl -xeu 服务 |
| 端口不通 | ss -tlnp + 防火墙状态 + 云安全组 |
| 域名不通 | dig 域名 / ping 域名 |
| 磁盘满 | df -h → du -sh /* | sort -h |
| 被爆破 | grep "Failed" auth.log | awk '{print $(NF-3)}' | sort | uniq -c |
| 被挂马/挖矿 | top + ps --sort=-%cpu + ss -tunap |
| 开机进不去 | 救援模式 + 检查 fstab/grub |
| 配置改了不生效 | 验语法(如 nginx -t)→ reload → 看日志 |
| 时间不对 | timedatectl set-ntp true |
本章自测题(随机抽 5 题演练)
- 网站突然极慢,你的前三个命令是什么?
- 服务 failed 且 journalctl 显示端口被占,完整处置命令序列?
- 磁盘满了但不知道谁占的,排查命令链?
- 「有空间但写不进文件」最可能是什么问题?怎么查?
- 发现陌生登录会话,你按什么顺序处置?
- 备份的三原则是什么?为什么必须演练恢复?
- SSH 突然连不上,排障顺序?
参考答案
1. uptime(负载)→ top(谁吃 CPU/内存)→ ss -tunap(连接)→ 再看 nginx/DB 日志。
2. ss -tlnp | grep 端口 找占用 → 停占用进程或服务换端口 → 改配置 → 服务 -t 验语法 → restart → status 确认。
3. df -h 定位分区 → du -sh /var/log /data 等逐层 → 找到大头后 logrotate/清理。
4. inode 满(小文件过多);df -i 查看,找邮件队列/缓存目录清理。
5. 立即 kill 陌生会话 → 冻结相关账号 → 查入侵迹象(第 9.8 全流程)→ 改密码/密钥 → 加固复盘。
6. 3-2-1(3 份、2 介质、1 异地);没演练过的备份可能根本恢复不了(坏文件/缺依赖),演练才能保证可用。
7. ssh -v 看卡点 → 本机网络 → 云安全组/防火墙 → sshd 状态与日志 → UseDNS 等配置排查。