网站突然打不开、页面加载缓慢或者接口频频报错,很多人的第一反应是刷新页面或者重启服务器。这种做法往往治标不治本。更高效的做法是沿着网络、服务器、应用、数据这一条链路逐层排查,先把问题范围缩小到具体环节,再集中精力处理,这样才能真正缩短故障恢复时间。
排查的第一步不是登录服务器,而是区分问题发生在你这边还是所有人这边。可以先用手机流量访问同一个网址,或者请外地同事帮忙打开测试。如果更换网络后网站恢复正常,说明问题多半出在你当前的网络环境;如果只有某个地区的用户打不开,那通常和线路波动或DNS解析有关。
在命令行执行nslookup或dig命令,查看域名解析出来的IP是不是服务器当前的地址。解析失败或者指向了旧IP,常见原因包括A记录和CNAME记录被误改,或者TTL值设得太大导致新记录迟迟不生效。登录域名管理面板逐条核对记录,同时确认CDN回源地址是否同步更新。遇到部分区域访问不了的情况,优先怀疑CDN节点缓存了旧的源站信息,刷新缓存或等待过期即可。
有时候ping能通,浏览器却仍然打不开页面,这通常说明防火墙或安全组拦截了HTTP/HTTPS请求。云服务器的用户需要登录控制台确认80和443端口已经放行。也可以在本地执行telnet 服务器IP 443试一下,如果提示连接超时或者被拒绝,那多半是防火墙拦截,少数情况是运营商限制了某些端口,这时可以考虑换个端口段或者联系网络服务商确认。
如果页面响应越来越慢,或者请求经常超时,大概率是服务器资源被消耗殆尽。CPU长期满载、内存紧张、磁盘写满或者带宽被打满,都会让请求在排队中等待,最终表现为卡顿甚至短暂中断。用top、free -h和df -h三条命令快速查看系统实时状态,就能大致锁定瓶颈在哪个方向。
在top输出里按CPU占用率排序,重点关注排在前面的进程。常见隐患大致有这几类:被入侵后植入的挖矿程序、数据库慢查询堆积成山,以及没有频率限制的爬虫在疯狂抓取。配合Web访问日志一起看,能进一步确认是哪个URL或IP在制造异常流量。举个例子,某个接口被外部程序每秒钟请求几十次,导致PHP进程数量快速飙升,日志里会清楚留下这个IP的访问记录,直接封掉就能缓解大部分压力。
磁盘使用率超过80%就该认真处理了。日志文件、临时目录或者Session目录一旦被写满,网站会因为无处写入数据而返回500错误,手动清理过期的日志和缓存通常能立即恢复。内存方面,如果free -h显示Swap占用持续在高位,说明物理内存不够用了,系统在内存和磁盘之间频繁交换数据,性能会明显下滑。这种时候要么优化常驻进程数量,要么考虑升级内存配置。
页面白屏、部分功能失效或者直接返回500状态码,问题多半集中在应用层。打开浏览器开发者工具的Network面板,先看关键请求的返回码:500表示进程内部出错,404说明路由或文件路径不对,403则指向权限不足或者IP被封禁。接下来去应用日志目录里找对应的错误堆栈,大部分情况下日志里的线索比代码本身更容易定位问题。
在日志中留意执行时间特别长的SQL语句或第三方接口调用。数据量增长后,原本正常的查询可能因缺少索引而变慢,或者某个外部接口超时设置过长,导致请求长时间占住线程不释放。遇到这类情况,先把超时时间调短,再针对慢查询做索引优化,往往能显著改善页面响应速度。
如果故障发生在刚发布新版本之后,优先对比新旧代码的差异,重点检查配置项改动、依赖库版本升级以及数据库结构变更。某些问题只在特定环境下出现,比如大小写敏感的表名、不同字符集造成的乱码,这些在本地环境很难复现,需要结合线上日志和错误信息定位。
很多应用层面的异常,追根究底是数据存储环节出了问题。比如数据库连接数被打满、主从复制延迟或者磁盘空间不足导致写入失败,这些都会让应用抛出各类异常。用show processlist查看数据库当前会话,能快速发现是否存在大量阻塞或长时间未结束的事务。
使用主从架构时,如果从库落后主库太多,读取到的数据就会是旧的,表现就是数据时有时无或者不一致。执行show slave status检查同步线程是否正常,留意Seconds_Behind_Master这个指标,如果持续增长说明延迟在扩大,需要检查从库的硬件性能或是否存在大事务干扰同步。
连接池配置过小、存在连接泄漏或者单次请求占用连接时间过长,都会导致连接数被占满,应用报错无法获取连接。合理设置连接池上限,同时确保代码中每次数据库操作都有对应的关闭逻辑,尽量在finally块里释放资源。如果业务量增长明显,也可以考虑读写分离来分担压力。
先确认是不是大规模故障。用手机流量访问测试,同时看看服务器商的控制台有没有异常通知。如果流量访问正常,多半是本地网络问题;如果所有网络环境都无法打开,再从DNS、服务器状态开始逐个排查。
最常见的是防火墙或安全组没有放行HTTP/HTTPS端口。也有可能是Web服务进程没有正常监听端口,或者监听了但配置了域名白名单,导致通过IP直接访问被拒。可以用telnet测试端口连通性,然后检查服务进程是否还在运行。
先打开应用运行日志,找到最近一条错误记录的具体堆栈信息。如果日志显示数据库连接失败,检查数据库服务状态和连接池配置;如果是代码抛出的异常,则根据堆栈定位到具体文件行号。查看日志之前不要盲目重启服务,否则错误现场可能就丢了。
网站故障排查并不复杂,关键是要有条理。从网络链路、服务器资源到应用代码和数据存储,按顺序一层一层筛查,每层都找到确凿证据再往下走,比东试一下西试一下高效得多。建议平时就把日志收集和监控工具配置好,出事时先看监控再看日志,能省下大量排查时间。如果这次没找到根本原因,等恢复后也要复盘记录,下次遇到类似问题就能更快定位。