线上网站出现白屏、接口超时或者加载缓慢时,与其反复刷新页面或仓促重启服务,不如建立一套纵向的排查逻辑。按照网络传输、服务器资源、应用运行、数据存储的顺序逐层过滤,多数故障都能在十几分钟内锁定大方向,避免在无关环节浪费大量精力。
接触服务器之前,先判断问题是否源自客户端一侧。可尝试断开Wi-Fi用手机流量访问,或者让不同地域的同事同时打开网站。如果换网络后访问顺畅,故障多半集中在本地网络或路由器;若只有特定地区的用户报障,大概率与运营商线路波动或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%需要立刻处理,日志文件或临时目录写满后,程序无法落盘会抛出500错误,清理过期日志和缓存通常能迅速缓解。内存方面,若free -h显示Swap使用率持续增长,说明物理内存已捉襟见肘,系统正频繁进行内外存交换,性能会急剧下降。此时应停用不必要的常驻服务,或者规划扩容内存。
全站白屏、个别接口失效或出现500报错,根因通常埋在应用代码、框架配置或依赖组件中。先翻看应用日志中最近的错误堆栈,再核对配置文件近期是否被改动,或某个依赖库是否升级到了不兼容版本。排查期间可临时提高日志输出级别,记录完整的请求参数与SQL语句,便于复现和定位。
打开框架自带的日志文件,搜索异常关键词如Exception、Error或Fatal,定位第一条报错出现的时间点。对比该时间点前后是否有部署操作、配置变更或大量并发涌入。举例来说,某商城在凌晨促销开始时出现大量超时,日志显示数据库连接池耗尽,真相是连接数配置过低,而非代码逻辑出错。回滚最近的改动,往往是快速止损的有效手段。
后端排查的最后一环通常是数据库。当CPU不高、应用日志也无明确报错,但请求依然缓慢时,需要检查是否存在慢SQL、锁等待或连接数打满的情况。进入数据库命令行执行show processlist;可以查看当前正在运行的语句,重点关注长时间处于Waiting for table lock或Sending data状态的连接。
开启慢查询日志,找出执行时间超过1秒的语句。常见问题是在大表上做了全表扫描,或者 WHERE 条件中的字段未建立索引。通过EXPLAIN查看执行计划,确认是否使用了预期的索引。例如订单查询按用户ID和时间筛选,但索引只建在ID上,导致时间过滤仍需回表,补充联合索引后响应时间往往能缩短数倍。
连接数打满会直接导致应用报错。检查数据库最大连接数配置,将其与应用连接池上限做合理匹配,避免连接被无效占用。同时留意长事务,长时间未提交的事务会锁住大量行记录。若某张表频繁出现锁等待,检查业务代码中是否存在事务内调用外部HTTP请求的情况,这类操作应移出事务范围。
先分清是全部用户打不开,还是部分区域或部分设备打不开。用手机流量访问一次,能通则排除服务器宕机可能;再用nslookup检查解析,随后telnet测试端口。三层动作可在五分钟内确认问题大致属于域名、网络还是服务器侧。
CPU不高说明计算压力不大,应重点查看数据库连接数是否打满、Redis等缓存是否失效导致大量请求落到数据库,以及出口带宽是否被下载任务或爬虫占满。用df -h检查磁盘,再用iftop查看带宽占用,能较快找到答案。
不能。缓存适合缓解读多写少的热点查询,但若数据频繁更新,缓存会导致数据不一致。引入缓存前应先优化SQL和索引,确认业务确实存在重复读取特征,并设计好缓存失效策略与穿透保护,否则可能引入新的故障点。
稳定的排查顺序能显著压缩故障恢复时间。日常可把网络、资源、代码、数据库四层检查项写成清单,每次故障按顺序执行并记录结论。同时重视监控告警,在资源使用率或错误率接近阈值时提前介入,远比事后匆忙救火更从容。