线上网站出现白屏、卡顿或接口报错时,反复刷新页面或盲目重启服务往往解决不了根本问题。更有效的思路是顺着用户请求的流转路径,从网络链路开始逐层向下排查,依次覆盖域名解析、服务器资源、应用进程和数据库配置。理清排查顺序,能显著缩短故障恢复时间,减少对业务的影响。
网站无法访问时,第一步不是登录服务器操作,而是先判断问题出在用户侧还是服务侧。一个简单的验证手段是切换网络环境:用手机流量替代办公网络访问测试,若恢复正常,多半是本地网络缓存或设备设置所致;若只有特定地区或运营商的用户反馈无法打开,则需要重点怀疑链路拥塞或解析记录尚未完全生效。
在命令行执行nslookup 你的域名,比对解析得到的 IP 与服务器真实公网地址是否一致。若解析为空或指向已废弃的旧 IP,通常说明控制台的 A 记录或 CNAME 配置有误。需要注意的是,修改解析后到全球生效存在一定延迟,短则几分钟,长则数小时。同时应确认 CDN 节点状态,避免部分地区的回源请求持续失败。
服务器能 ping 通但网页无法打开,大概率是端口未对外开放。云服务商的安全组和服务器内部防火墙需同时放行 80 与 443 端口。在本机执行telnet 服务器IP 443,若提示连接超时,基本可锁定为防火墙拦截或上游 ISP 限制。此时先检查安全组入站规则,再排查 iptables 等本地策略。
页面响应缓慢、请求排队超时,通常与服务器资源耗尽密切相关。CPU 持续满载、内存告急、磁盘剩余空间不足或带宽被占满,都会直接拖慢在线服务。登录服务器后,依次使用top查负载与 CPU 占用、free -h看内存情况、df -h查磁盘余量,这几条命令能快速评估系统整体健康状况。
在top界面按 P 键按 CPU 占用率排序,仔细核对排名靠前的进程。常见异常消耗包括:被植入的挖矿程序、缺少索引导致的慢查询堆积,以及恶意爬虫的高频抓取。交叉查看 Nginx 或 Apache 的访问日志,能确认这些请求来源的 IP 和 URL。例如,发现某个接口每秒被调用数百次,可通过限制请求频率或临时封禁来源 IP 缓解压力。
磁盘使用率超过 80% 就应警惕。会话文件、运行日志或临时目录写满后,程序无法正常创建缓存,通常直接抛出 500 错误。清理过期日志和临时文件,往往能快速释放空间。内存方面,若free -h显示 swap 分区读写频繁,说明物理内存严重不足,系统在内存与磁盘间频繁换页,整体性能会急剧下降。此时应优先优化应用的内存占用,必要时再考虑扩容。
网络和资源层面均正常时,问题往往出在应用本身。页面白屏、特定功能不可用或接口返回 5xx,都需要结合日志定位。查看 Nginx 错误日志与应用的运行日志,重点关注报错堆栈和异常抛出的上下文信息。例如,PHP 的 fatal error 或 Java 的 OutOfMemoryError 通常会直接打印在日志中。若日志中出现大量数据库连接超时的提示,则需将排查重心转向数据库层。
应用进程可能因崩溃或 OOM 被系统杀掉,但服务器本身仍正常运行。通过ps aux | grep java或systemctl status 服务名确认进程是否存在,再用ss -lntp或netstat -lntp查看端口监听是否正常。若进程没了,先查看日志了解退出原因,再考虑重启,避免反复崩溃造成重启风暴。同时检查依赖的中间件,如 Redis 或消息队列是否可用,因为连接断开也会导致请求失败。
如果只是部分请求超时,需要查看应用或网关的超时设置。Nginx 的 proxy_read_timeout 或应用的连接池超时过短,都会在流量高峰时造成大量 504 错误。此时可临时调大超时时间观察效果,并进一步分析慢请求的耗时分布,确认是代码逻辑问题还是外部依赖变慢。例如,第三方支付回调响应迟缓,就会拖住整个订单处理链路。
数据库是大多数网站的核心依赖,排查顺序应当放在应用之后。先确认数据库进程是否存活、能否正常连接,再检查连接数是否打满。当应用报错"too many connections"时,通常是连接池配置过大或存在未被释放的连接。此时可临时重启数据库或调整连接上限,但根本解法还是优化应用中的连接管理。
开启慢查询日志是定位数据库性能问题的有效手段。在 MySQL 中执行SET GLOBAL slow_query_log = ON并设置合适的 long_query_time,收集一段时间内的慢 SQL。分析这些 SQL 的执行计划,确认是否缺少索引或存在全表扫描。例如,一个未加索引的状态字段被频繁用来过滤订单,积累到一定量级后响应就会急剧上升。
如果数据库 CPU 不高但请求仍然卡顿,需要检查是否存在锁等待。通过SHOW PROCESSLIST查看是否有大量 State 为 Updating 或 Locked 的会话。常见原因是长事务未提交,导致其他写操作长时间阻塞。遇到这种情况,可先定位长时间运行的事务,评估后考虑终止,并从代码层面优化事务长度,减少锁持有时间。
最常见的原因是端口未放行或防火墙策略拦截。先检查云安全组是否开放了 80/443 端口,再确认服务器内部防火墙规则。其次,也可能是 Web 服务进程崩溃但系统存活,可查看进程和端口监听状态来区分。
可以检查应用依赖的中间件,如数据库、Redis、消息队列是否正常,特别是连接数和响应时间。还可以看网关层或负载均衡的访问日志,对比正常时段与故障时段的响应码分布,找出共性规律。
这说明根本原因没有被消除。需要从日志和监控数据中找规律,观察故障发生的资源水位、请求来源和对应时间段。建议配置基础监控告警,在资源超过阈值时提前收到通知,并在代码层面优化导致问题的高频操作。
网站故障排查并没有万能公式,但遵循从外到内、逐层推进的顺序,可以避免做无用功。从网络和解析开始,再到服务器资源、应用进程和数据库,每一步都要先收集证据再动手,并保留好相关日志和状态记录。建议提前建立一套可执行的排查清单,配合常用命令写在应急文档中,这样在真正出故障时,团队每个人都能按步骤稳定操作,尽快恢复服务。