Ubuntu服务器一旦出现故障,最直接的表现往往是SSH连不上、服务无响应、CPU或内存占用异常升高、磁盘写满或者网络时断时续。排查时不要急着重启服务器,因为重启会清空很多现场信息,导致后续无法定位根因。正确的做法是先确认故障范围,再按“系统资源—日志—服务状态—网络—硬件”的顺序逐层排查。下面直接给出具体操作路径和修复方法。
第一步:确认是否还能登录系统如果SSH能连上,只是响应很慢,优先执行 top 或 htop 查看CPU和内存占用。注意看load average三个数值,如果第一个数值远大于CPU核心数,说明系统负载已经过载。接着用 iostat -x 1 查看磁盘IO利用率,如果%util持续接近100%,基本可以判断是磁盘IO瓶颈。如果SSH完全连不上,可以尝试通过云服务商的控制台或带外管理进入救援模式,先挂载根分区再检查。
第二步:快速定位高占用进程执行以下命令可以按CPU占用排序输出进程:
ps aux --sort=-%cpu | head -20
如果发现某个进程CPU占用异常,先确认它是不是业务进程。如果是MySQL、Nginx、PHP-FPM这类常见服务,不要直接kill,先查看对应日志。如果是陌生进程,立即检查其启动路径和父进程:
ls -l /proc/PID/exe cat /proc/PID/cmdline
同时用 systemctl status 进程名 查看该服务是否被systemd管理。对于内存占用过高的情况,用 free -h 查看实际可用内存,再结合 ps aux --sort=-%mem | head -20 找到内存大户。很多Ubuntu服务器故障是因为OOM Killer杀掉了关键进程,可以通过 dmesg | grep -i oom 确认是否有OOM记录。
第三步:磁盘空间和inode检查磁盘写满是最常见的Ubuntu服务器故障之一。执行 df -h 查看各分区使用率,如果根分区达到100%,立即找出大文件:
du -sh /* 2>/dev/null | sort -rh | head -20
逐层进入大目录继续定位。特别注意 /var/log 下的日志文件,很多故障是日志没有轮转导致磁盘爆满。可以用 journalctl --disk-usage 查看systemd日志占用。如果发现某个日志文件特别大,先清空它:
truncate -s 0 /var/log/syslog
另外要检查inode是否耗尽,因为即使磁盘空间足够,inode用完也会导致无法创建新文件:
df -i
如果IUse%达到100%,通常是大量小文件堆积,常见于邮件队列、缓存目录或session目录。用 find / -xdev -type f | wc -l 统计文件总数,再定位具体目录。
第四步:系统日志深度分析日志是定位故障根因的关键。Ubuntu的日志主要集中在 /var/log/ 下,重点查看以下几个:
tail -n 100 /var/log/syslog tail -n 100 /var/log/kern.log journalctl -xe
如果服务器是突然宕机或重启,重点看kern.log和dmesg输出中是否有硬件错误、内核panic或温度过高记录。如果某个服务反复崩溃,用 journalctl -u 服务名 -n 50 查看该服务的详细日志。对于Nginx或Apache,分别查看 /var/log/nginx/error.log 和 /var/log/apache2/error.log。对于MySQL,查看 /var/log/mysql/error.log。日志里出现“Too many open files”说明文件描述符达到上限,需要调整 /etc/security/limits.conf 中的nofile值。
第五步:网络故障排查如果服务器能登录但网络异常,先检查网络接口状态:
ip addr show ip route show
确认IP地址和路由是否正常。用 ping 网关地址测试内网连通性,再用 ping 8.8.8.8 测试外网连通性。如果ping不通外网但能ping通网关,检查DNS解析:
cat /etc/resolv.conf nslookup example.com
很多Ubuntu服务器故障是DNS配置错误或systemd-resolved服务异常导致。可以尝试重启网络相关服务:
systemctl restart systemd-resolved systemctl restart networking
如果使用Netplan管理网络,检查配置文件:
cat /etc/netplan/*.yaml netplan apply
对于防火墙问题,用 ufw status 查看规则,如果怀疑防火墙拦截了关键端口,可以临时关闭测试:
ufw disable
但测试完一定要重新启用。如果服务器频繁出现网络中断,用 ethtool eth0 查看网卡速率和双工模式是否正常,同时检查 /var/log/syslog 中是否有网卡驱动报错。
第六步:服务故障专项排查Web服务器故障:先确认Nginx或Apache进程是否存在,再检查端口监听:
ss -tlnp | grep ':80\|:443'
如果端口没有监听,查看服务启动日志。配置文件语法错误是常见原因,Nginx用 nginx -t 检查,Apache用 apache2ctl configtest。如果端口被占用,用 lsof -i :80 找到占用进程。
数据库故障:MySQL或PostgreSQL无法启动时,先看错误日志。常见原因包括数据目录权限错误、磁盘空间不足、配置文件参数错误。MySQL可以用 mysqld --verbose --help 验证配置,PostgreSQL用 pg_ctlcluster 查看集群状态。如果数据库能启动但查询缓慢,用 SHOW PROCESSLIST 查看慢查询,结合慢查询日志定位具体SQL。
SSH服务故障:如果SSH无法连接,先确认sshd是否在运行:
systemctl status ssh ss -tlnp | grep :22
如果sshd正常但连接被拒绝,检查 /etc/hosts.deny 和 /etc/hosts.allow 是否有限制,以及 /etc/ssh/sshd_config 中的AllowUsers或DenyUsers配置。如果SSH能连接但认证失败,查看 /var/log/auth.log 中的认证记录。
第七步:硬件和内核问题排查硬件故障往往表现为服务器随机重启、死机或出现大量内核错误。用以下命令检查硬件健康状态:
dmesg | grep -i error dmesg | grep -i fail sensors
如果安装了lm-sensors,可以查看CPU温度和风扇转速。内存问题可以用 memtest86+ 在重启时检测,但生产环境不方便重启时,可以用 mcelog 查看机器检查异常记录。对于磁盘硬件问题,用 smartctl -a /dev/sda 查看SMART数据,重点关注Reallocated_Sector_Ct和Pending_Sector_Ct两个指标,如果数值持续增长,说明磁盘即将损坏,需要尽快更换。
第八步:系统更新和包管理修复有些故障是由于软件包版本过旧或依赖关系损坏导致。定期执行系统更新可以修复已知漏洞和bug:
apt update apt upgrade
如果出现依赖错误,用以下命令修复:
apt --fix-broken install dpkg --configure -a
如果某个服务升级后出现故障,可以查看 /var/log/apt/history.log 找到最近的升级记录,考虑回滚相关软件包。对于内核升级导致的问题,可以在GRUB启动菜单中选择旧内核启动,然后卸载有问题的内核版本。
第九步:建立预防性运维机制故障修复后,更重要的是建立预防机制。建议配置以下监控项:
1. 磁盘使用率监控,当使用率超过80%时告警。
2. CPU和内存使用率监控,设置合理的告警阈值。
3. 关键服务存活监控,如Nginx、MySQL、SSH等。
4. 日志集中收集和分析,可以使用rsyslog或journald远程转发。
5. 定期备份关键数据和配置文件,备份要验证可恢复性。
6. 配置日志轮转,确保日志不会无限增长:
cat /etc/logrotate.d/custom
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
}
7. 设置自动安全更新,对于非关键服务可以启用unattended-upgrades。
8. 定期检查文件系统完整性,使用tripwire或aide等工具。
第十步:应急响应流程总结当Ubuntu服务器再次出现故障时,按照以下流程操作:先保持现场,不要重启;确认故障范围和影响面;收集系统资源使用情况;查看相关日志;定位根因后针对性修复;修复后验证服务恢复;最后复盘并更新运维文档。整个过程中,操作要谨慎,尤其是涉及数据删除、服务重启和系统重启的操作,务必确认影响范围后再执行。对于生产环境,建议先在测试环境复现问题,验证修复方案后再应用到生产服务器。
Ubuntu服务器运维的核心能力不在于会敲多少命令,而在于能否快速建立排查路径,从现象到根因逐层深入。掌握上述方法后,大部分常见故障都能在半小时内定位并解决。对于复杂故障,保持冷静、系统化排查比盲目尝试更重要。
