Linux 服务器运维排查实战手册

服务器出问题是每个运维都要面对的日常。排查故障最怕的就是没有思路,东试一下西试一下,最后问题没解决,时间还浪费了不少。这篇手册整理了一些常见的故障场景和排查流程,希望能帮你在遇到问题时有个清晰的思路。

一、排查前的准备工作

在动手排查之前,先确认几件事:文章源自堕落的鱼-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. 应用层:应用日志、数据库连接

从外到内,从简单到复杂,逐步缩小范围。记住:先收集信息,再动手操作。重启是最后的选择,不是第一选择。

希望这篇手册能帮到你。有问题欢迎交流。

 
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证