服务器出问题是每个运维都要面对的日常。排查故障最怕的就是没有思路,东试一下西试一下,最后问题没解决,时间还浪费了不少。这篇手册整理了一些常见的故障场景和排查流程,希望能帮你在遇到问题时有个清晰的思路。
一、排查前的准备工作
在动手排查之前,先确认几件事:文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
1. 确认问题现象文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
- 是完全连不上,还是连上了但服务异常?
- 是突然出问题,还是逐渐变慢的?
- 有没有报错信息?报错是什么?文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
这些信息决定了排查的方向。完全连不上通常是网络或系统层面的问题,服务异常则可能是应用层面的问题。文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
2. 保留现场文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
如果服务器还能登录,先别急着重启。重启可能会让问题消失,但也可能让线索消失。先收集日志、截图、进程信息,保存下来再动手。文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
---文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
二、SSH 连不上的排查流程
这是最常见的故障之一,按这个顺序来:文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
第一步:确认网络层文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
ping 服务器IP
如果 ping 不通,说明网络层有问题。可能是:
- 服务器关机了
- 网络配置出错(IP 冲突、路由问题)
- 云服务商的网络故障文章源自堕落的鱼-https://www.duoluodeyu.com/2845.html
这时候登录云服务商控制台,看看服务器状态是不是"运行中"。
第二步:确认端口层
如果 ping 通但 SSH 连不上,测试端口:
telnet 服务器IP 22
如果连不上,可能是:
- 安全组/防火墙没放行 22 端口
- SSH 服务没启动
- SSH 端口被改了(不是默认的 22)
第三步:检查安全组
登录云服务商控制台,找到安全组设置,确认:
- 入站规则里有允许 22 端口的规则
- 规则里的 IP 范围包含你的 IP(有些安全组限制特定 IP)
第四步:通过控制台登录
如果以上都没问题,用云服务商提供的 VNC/串口控制台登录服务器。这个方式不依赖 SSH,可以直接看到服务器桌面或命令行。
登录后检查 SSH 服务状态:
systemctl status sshd
如果服务没启动,启动它:
systemctl start sshd
第五步:查看 SSH 日志
tail -n 50 /var/log/auth.log
看看有没有报错信息,比如密钥权限不对、配置语法错误等。
---
三、网站打不开的排查流程
网站访问异常通常表现为 502、504、连接超时等。排查思路:
第一步:确认服务器状态
# 看服务器是否还在运行 uptime # 看负载情况 cat /proc/loadavg
如果负载特别高(超过 CPU 核心数的 2-3 倍),说明服务器很忙,可能是被攻击了,或者有进程在疯狂占用资源。
第二步:检查 Web 服务器
# Nginx systemctl status nginx # Apache systemctl status apache2
如果服务没启动,启动它并查看错误日志:
# Nginx 错误日志 tail -n 100 /var/log/nginx/error.log # Apache 错误日志 tail -n 100 /var/log/apache2/error.log
第三步:检查后端应用
如果是 PHP 网站:
# 检查 PHP-FPM 状态 systemctl status php8.1-fpm # 看 PHP-FPM 错误日志 tail -n 100 /var/log/php8.1-fpm.log
如果是 Node.js/Python 应用:
# 看进程是否在运行 ps aux | grep node # 看应用日志 tail -n 100 /var/www/yourapp/logs/app.log
第四步:检查磁盘空间
磁盘满了会导致各种奇怪的问题,包括服务启动失败、数据库写入失败等。
# 看磁盘使用情况 df -h
如果某个分区使用率 100%,清理空间:
# 找大文件 find / -type f -size +100M 2>/dev/null # 清理日志(谨慎操作) find /var/log -type f -name "*.log" -mtime +7 -delete # 清理 apt 缓存 apt clean
第五步:检查内存
# 看内存使用情况 free -h # 看占用内存最多的进程 ps aux --sort=-%mem | head -11
如果内存耗尽,系统会使用 swap,性能会急剧下降。这时候要么加内存,要么找出占用内存的进程优化或重启。
---
四、MySQL 数据库连不上的排查
第一步:检查服务状态
systemctl status mysql
如果没启动,启动它:
systemctl start mysql
第二步:本地连接测试
mysql -u root -p
如果本地能连上但远程连不上,可能是:
- 防火墙没放行 3306 端口
- MySQL 配置绑定了 127.0.0.1,不接受远程连接
- 用户权限限制(只允许 localhost 连接)
第三步:查看错误日志
tail -n 100 /var/log/mysql/error.log
常见错误包括:
- 磁盘空间不足
- 内存不足导致 OOM
- 数据文件损坏
第四步:检查连接数
# 登录 MySQL 后执行 SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections';
如果连接数接近上限,可能是:
- 应用没有正确关闭连接
- 有慢查询导致连接长时间占用
- 真的需要更多连接
临时增加连接数:
SET GLOBAL max_connections = 500;
---
五、CPU 使用率 100% 的排查
第一步:找出占用 CPU 的进程
# 实时查看 top # 或者更友好的界面 htop
按 CPU 使用率排序,看哪个进程在占用资源。
第二步:判断进程是否正常
- 如果是 nginx、php-fpm、mysql 这些,是正常的业务进程
- 如果是一些奇怪的进程名,比如随机字符串、/tmp 目录下的可执行文件,可能是挖矿木马
第三步:处理异常进程
如果是可疑进程:
# 先记录进程信息 ps aux | grep 进程名 > /tmp/suspect_process.txt # 找到进程的可执行文件位置 ls -la /proc/PID/exe # 杀死进程 kill -9 PID
第四步:检查定时任务
很多木马会通过定时任务复活,检查:
# 当前用户的定时任务 crontab -l # 系统定时任务 cat /etc/crontab ls -la /etc/cron.d/ ls -la /etc/cron.hourly/ ls -la /etc/cron.daily/
如果发现可疑的定时任务,删除它。
第五步:检查启动项
# systemd 服务 systemctl list-unit-files --state=enabled # 检查是否有异常服务 ls -la /etc/systemd/system/
---
六、磁盘空间不足的排查
第一步:看整体使用情况
df -h
第二步:找出占用空间最大的目录
# 从根目录开始,看哪个目录占用最大 du -sh /* 2>/dev/null | sort -rh | head -20 # 进入大目录继续深入 cd /var du -sh * 2>/dev/null | sort -rh | head -20
第三步:常见的大文件位置
# 日志文件 /var/log/ # 数据库文件 /var/lib/mysql/ # 网站文件 /var/www/ # 临时文件 /tmp/ /var/tmp/ # 用户上传的文件 /home/*/uploads/
第四步:安全清理
# 清理旧的日志(保留最近7天) find /var/log -type f -name "*.log.*" -mtime +7 -delete # 清理 apt 缓存 apt clean # 清理旧的内核(保留当前使用的和上一个) dpkg -l | grep linux-image apt autoremove --purge
第五步:检查是否有大文件被删除但进程还在占用
# 找出被删除但还被占用的文件 lsof +L1
这种情况会导致 df 显示有空间,但实际上写不进去。重启占用这些文件的进程可以释放空间。
---
七、网络问题的排查
第一步:检查网络配置
# 看 IP 地址 ip addr # 看路由表 ip route # 看 DNS 配置 cat /etc/resolv.conf
第二步:测试连通性
# ping 网关 ping 网关IP # ping 外网 ping -c 4 8.8.8.8 # ping 域名(测试 DNS) ping -c 4 www.baidu.com
如果 IP 能 ping 通但域名不行,说明 DNS 有问题。
第三步:检查端口监听
# 看哪些端口在监听 ss -tulnp # 看特定端口 ss -tulnp | grep :80
第四步:检查防火墙
# UFW(Ubuntu) ufw status verbose # firewalld(CentOS) firewall-cmd --list-all # iptables iptables -L -n -v
---
八、一些实用的排查命令
快速查看系统状态
# 一键看 CPU、内存、磁盘、负载
printf "CPU: "; top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1; printf "Memory: "; free | grep Mem | awk '{printf "%.1f%%\n", $3/$2 * 100.0}'; printf "Disk: "; df -h / | tail -1 | awk '{print $5}'; printf "Load: "; cat /proc/loadavg | awk '{print $1}'
查看最近的登录记录
last -n 20
查看当前登录的用户
who w
查看系统启动时间
uptime
查看最近的系统日志
journalctl -xe --since "1 hour ago"
---
九、总结
服务器排查的核心思路是分层:
1. 网络层:ping 测试、端口测试、防火墙检查
2. 系统层:CPU、内存、磁盘、负载
3. 服务层:进程状态、服务日志
4. 应用层:应用日志、数据库连接
从外到内,从简单到复杂,逐步缩小范围。记住:先收集信息,再动手操作。重启是最后的选择,不是第一选择。
希望这篇手册能帮到你。有问题欢迎交流。










