网站打不开、页面加载慢、接口频繁报错,遇到这些问题时直接重启服务往往只能暂时缓解,过一阵问题又会卷土重来。更靠谱的做法是沿着网络链路、服务器资源、应用运行环境、数据库四个层面依次排查,逐步缩小范围,最终锁定真正的故障点。这套方法能帮你把排查精力用在刀刃上。
别急着登录服务器,第一步先判断问题是不是出在客户端网络或域名解析上。你可以切换网络环境试一下,比如手机关闭Wi-Fi改用4G/5G流量访问,或者让不同城市的同事帮忙打开同一个网址。如果换网络后访问恢复正常,基本可以断定是本机或本地网关的问题;如果多个地区都打不开,那就要考虑DNS解析或网络节点出状况了。
在本地命令行输入nslookup或dig,能看到域名当前解析出的IP地址,再和服务器公网IP比对。如果结果为空、或者指向的IP不是当前服务器,基本可以判定是A记录或CNAME记录被改动,或者TTL时间设得太长导致各地DNS节点还在使用旧缓存。处理办法是登录域名管理后台,逐条核对解析记录,同时留意CDN回源配置是否失效。要是只有个别地区访问异常,多半是CDN节点缓存了旧源站内容,手动刷新一下CDN缓存基本就能解决。
ping命令能通、但浏览器打不开页面,这种情况通常指向防火墙或安全组没有放行Web流量。用云服务器的话,先去控制台看入方向规则里80和443端口是否放行;本地再执行telnet 服务器IP 443确认端口连通性。如果超时或直接被拒,优先检查安全组规则和云主机内部防火墙配置,顺便也要考虑机房或运营商是不是封了特定端口。稳妥起见,可以临时换一个端口验证,或者直接提交工单问服务商排查。
当页面响应时间越来越长、请求频繁超时,多半是服务器资源到了瓶颈。CPU打满、内存不足、磁盘写满、带宽被占光,任何一项异常都会让请求在队列里排队,最终表现就是访问卡顿甚至连接失败。登录服务器后,依次输入top、free -h、df -h三个命令,可以快速看清系统资源现状,判断瓶颈集中在哪一端。
在top界面按大写M或P排序,重点观察CPU或内存占用最高的进程。常见的异常类型有几种:服务器被植入挖矿程序、数据库慢查询堆积、爬虫脚本没有频控持续刷接口。这时候要打开Web访问日志,看看哪些URL路径或者来源IP贡献了超常流量。举例来说,如果发现某个IP每秒请求同一接口几十次,导致PHP进程数量快速膨胀,日志里会完整记录它的访问轨迹,直接把该IP拉黑就能很快恢复。如果进程名称看起来没问题但CPU占用极高,可以用ls -l /proc/PID/exe查看它对应的真实可执行路径,确认是否被伪装。
磁盘使用率达到80%以上就应该警惕了。日志文件、临时上传目录、Session目录一旦写满,网站就没法写入任何新数据,页面频频抛出500错误。清理历史日志和过期的缓存文件,通常能释放出大量可用空间。同时别忘了看free -h里的swap列,如果swap占用持续居高不下,说明物理内存不够用,系统正在频繁做磁盘交换,这会严重拖慢整体性能。此时优先考虑增加内存,或者减少常驻进程数量,释放部分内存压力。
网络和服务器资源都没问题,就要下沉到应用层面。检查应用自身的错误日志、运行日志和依赖的外部服务状态,通常能找到关键线索。
不管是Nginx、Apache还是Tomcat,都提供了清晰的错误日志路径。比如Nginx的error.log、Java应用的catalina.out。打开日志重点查找Timeout、Connection refused、OutOfMemory等关键词。如果日志中出现大量数据库连接超时,而数据库本身没有问题,那多半是应用连接池配置过小,或者代码里忘了释放连接。遇到这种情况,调整连接池上限,或者优化代码释放逻辑,比盲目重启有效得多。同时检查反向代理的超时时间设置,短超时会在上游处理稍慢时提前断连。
故障往往在更新版本或配置文件后突然出现。回想最近一次发布或修改配置的时间点,优先审查这些变更。对比一下当时改过的代码逻辑、环境变量、依赖包版本,有没有明显异常。另外,如果应用依赖外部支付接口、短信服务或第三方API,这些服务本身出故障也会让网站相关功能瘫痪。可以用curl或Postman单独请求这些外部接口,看它们是否正常返回。同时检查配置文件里的连接串、密钥、回调地址是否有变更,很多隐藏故障都源于配置项被误改。
Web应用响应缓慢、特定接口卡死,不少根源在数据库。排查数据库问题时,可以从慢查询、锁等待和连接数三个方面入手。
以MySQL为例,通过以下命令开启慢查询日志,精确找出执行时间超长的SQL语句:
很多慢查询的根源是查询条件中的字段没有建索引,或者使用了LIKE '%关键词%'这种无法命中索引的写法。给高频查询字段补上复合索引,往往能显著缩短响应时间。需要注意的是,在高峰期开启慢查询日志本身会增加磁盘I/O,建议错峰开启,采集半小时左右即可关闭。
当多个事务同时操作同一行数据时,数据库会出现锁等待。执行SHOW ENGINE INNODB STATUS可以看到是否有长时间未释放的锁,配合information_schema.processlist查看当前正在运行的SQL和它们的执行状态。如果发现大量进程处于Waiting for table metadata lock状态,说明某条DDL语句或长事务把表锁住了,找出并终止占用锁的会话即可恢复。同时也要留意数据库连接数,查看监控是否经常出现Too many connections报错,如果是,就需要调大max_connections并检查应用连接池是否及时归还了连接。
这种间歇性故障最常见的原因是服务器资源周期性饱和。比如定时任务在每个整点触发数据备份或日志切割,此时CPU和磁盘I/O瞬间飙高,导致处理请求变慢。另一个常见原因是数据库连接池被占满后,新请求等待获取连接超时,而部分请求恰好赶上连接被释放,所以又能访问。建议监控资源使用曲线,看故障时段是否和定时任务时间重叠,同时检查数据库最大连接数和应用的连接池配置。
图片走的是静态资源请求,和文字内容的请求路径不同。优先查看浏览器的开发者工具网络面板,看图片请求返回的HTTP状态码。如果返回403,说明图片目录的权限配置有误,或者CDN鉴权失效;如果返回404,可能是图片路径写错,或者文件被误删;如果返回200但图片一直转圈,则大概率是带宽被打满,或者CDN回源速度太慢。按状态码的方向去逐项排查,很快就能定位问题。
如果四个层面都查过仍没突破,建议把排查过程做一次系统记录,把时间点、操作、结果整理成清单,然后尝试以下方法:一是找团队其他同事一起看,新人视角往往能发现被忽略的细节;二是对比故障前后的监控数据,看是否有某个指标出现明显跳变;三是考虑回滚最近一次的代码或配置变更,即使当时觉得改动无关紧要。
网站故障排查的核心是掌握一套固定的排查顺序:先网络链路与域名解析,再服务器资源,接着应用层,最后深入数据库。每一步都要先确认现象、再查配置、最后看日志,避免在错误的方向上浪费时间。平时做好监控告警、定期清理日志和备份关键配置,很多问题在爆发前就能提前发现。排查时保持冷静,按流程逐层筛查,多数故障都能在较短的时间内定位并解决。