当网站突然变慢、页面白屏或者接口开始报错时,与其频繁刷新页面或盲目重启服务,不如按照一套清晰的排查路径逐层找原因。故障源头通常藏在线路传输、服务器状态、程序代码和数据库这几个层级,理清顺序再动手,往往能更快让服务恢复正常。
网站打不开,先别急着碰服务器。第一步要做的是判断问题出在用户这边还是服务端。一个简单的验证方法是换一个网络环境访问,比如用手机流量而不是办公室Wi-Fi打开网站。如果手机能正常访问,那问题多半出在本地的网络缓存或设备设置上。另外一种情况是,只有某个地区的用户或某一运营商的用户反映访问异常,这就要重点考虑线路拥堵,或者域名解析还没有完全生效。
在电脑终端里输入nslookup 你的域名,看看解析出来的IP是否和服务器实际的公网地址一致。如果显示不出来,或者指向了一个已经停用的老IP,那基本就是域名解析设置出错了,需要去域名服务商控制台检查A记录或CNAME配置。改完解析不是立刻生效的,全球节点同步需要时间,短则几分钟,长则几小时。另外,如果用了CDN,也要确认是不是某个CDN节点出了问题,导致部分地区的请求回源失败。
有时候能Ping通服务器,但网页就是打不开,原因往往是端口没放开。云服务商的防火墙和服务器内部的防火墙,都要确保80和443端口是放行的。这时候可以打开命令行,输入telnet 服务器IP 443测试一下。如果连接超时,基本可以判断是防火墙拦截了。优先去云控制台的安全组规则里查看,确认没有违规的拦截策略,然后再检查服务器内部自带的防火墙规则。
页面响应慢、请求大面积超时,多数的根源是服务器资源快被用完了。CPU使用率一直很高、内存不够、磁盘满了或者带宽跑满,都会导致请求排队,网站就会变得很卡,甚至直接断连。登录服务器后,第一时间用top命令看负载和CPU占用,再用free -h看内存,最后用df -h查一下磁盘剩余空间。这一套组合命令有助于快速判断系统整体是否健康。
在top界面里按大写P键,让进程按CPU使用率排序,然后重点看排在最前面几个进程。常见的问题是服务器被植入了挖矿程序,或者有些数据库查询没走索引导致长时间卡住,还有一种可能是恶意爬虫在不断请求。把这些高占用的进程记录下来,再去检查Nginx或Apache的访问日志,看看请求都来自哪些IP和地址。举个例子,如果发现某个接口每秒被调用几百次,那就可以通过限制IP频率来减轻服务器压力。
磁盘用到80%就要开始警惕了。如果日志或临时文件把磁盘写满,程序就不能正常写入缓存,网站会直接报500错误。把旧的日志文件和临时文件清理掉,通常空间就释放出来了。内存方面,如果看到free -h显示Swap分区读写很频繁,说明物理内存确实不够了,系统正在不不停地把数据在内存和硬盘之间搬运,这样网站性能会大幅下降。遇到这种情况,要优先优化程序自身的存储方式,实在不行就只能增加内存了。
页面白屏、某些功能用不了,或者直接看到5xx开头的错误码,问题基本出在应用程序这一层。打开浏览器开发者工具的Network面板,先看下报错请求的HTTP状态码最直接:500是程序内部逻辑出错,502代表网关连不上后端节点,504是后端处理超时了。搞清楚状态码的含义,排查方向就不会跑偏。
找到应用框架的日志输出位置,例如查看/var/log/目录下的文件,或者应用程序自己生成的运行日志。日志里出现 ERROR 或 EXCEPTION 字样时,后面通常跟着完整的调用堆栈,能看到具体是哪一个文件里的哪一行代码触发了异常。对照日志提示去修复代码,比盲目猜测要高效得多。
通过systemctl status或ps aux检查后端进程是否还在正常运行,比如Nginx、PHP-FPM或Java服务。有时候进程并没有退出,但线程卡死了,这时可以试试优雅重启服务,让进程重新加载配置,同时留意重启时是否有报错信息出现。
确认程序代码没有问题后,需要把注意力转移到数据存储环节。数据库响应慢通常表现为两种情况:一是数据库服务器把CPU跑满,二是某些SQL语句执行得特别慢。
数据库配置里把慢查询日志记录下来,建议把超过1秒的SQL都记下来。查看日志后,定位到耗时长的语句,再用EXPLAIN查看执行计划。如果显示全表扫描,那就是没有命中索引,可以针对查询条件里的字段加上索引来解决。需要注意的是,加索引要仔细评估,在写多读少的表上建太多索引反而会影响写入性能。
当数据库连接数被占满时,程序就无法获取新的连接,报错信息里通常是Too many connections。这可能是连接池配置得太小,也可能是某些事务一直没提交,把连接占住了。查看当前是否有长时间没有提交的事务,并把空闲的连接释放掉。另外,当出现大量锁等待时,可以用命令查看阻塞的源头,把占用锁的事务结束掉。
Ping通只能说明服务器在线,不代表网站服务正常。比较常见的原因是80或443端口没有被放行,需要去云防火墙里查安全组规则。另外,如果服务器的CPU或内存被打满,程序虽然还在运行,但已经无法处理新的网页请求,也会出现类似现象。
先开启慢查询日志,找出执行时间最长的SQL语句,然后通过索引优化调整查询逻辑。同时查看当前活跃连接数和是否有大量短连接频繁建立。另外,也要确认是否有外部服务在短时间内发起了大量密集的数据请求,必要时对数据访问接口增加频率限制。
建议先从资源层面快速扫一眼,用top、free等命令确认系统负载是否正常。如果资源没有异常,再去分析应用日志。这样做的好处是能够快速排除环境因素,缩小问题范围。如果一上来就研究日志,可能会在错误的方向上花很多时间。
网站故障排查没有固定的万能公式,但有一个通用的先后顺序:从网络层入手,再看服务器状态,接着是应用日志,最后深挖数据库。按照这个路径逐层往下走,能减少很多重复劳动。建议在日常运维中养成记录操作日志的习惯,把每次故障的原因和处理方法都写下来,故障来临时会非常有帮助,也能加快下次定位问题的速度。