网站突然打不开,屏幕上要么白屏一片,要么弹出一串看不懂的错误码,确实让人着急。别慌,绝大多数访问故障的根源都逃不出服务器资源、网络链路、程序运行和数据库连接这几个方面。掌握一套从底层到上层、从硬件到软件的排查顺序,就能快速缩小范围,精准定位问题。
网站无法访问时,第一反应不应该是去翻代码,而是先确认服务器本身是否还“活着”。登录云服务商的控制台,或者通过 SSH 工具远程连上主机,重点查看三项指标:系统已经运行了多久(uptime)、CPU 与内存的占用比例、磁盘剩余空间是否充足。
如果发现 CPU 或内存的负载图长期顶着上限,几乎可以断定是资源耗尽导致服务拒绝新请求。这时候要立马找出占用最高的进程并处理掉,等系统平稳后再考虑是优化程序还是升级配置。磁盘空间同样不能忽视,一旦写满,不仅网站会卡死,数据库写入也会悄悄失败,表面看起来就只是“网站打不开了”。
系统日志是排障时最值得信赖的线索。Linux 环境可以执行 dmesg 命令或者查看 /var/log/messages 文件,Windows 服务器则去事件查看器里翻翻。重点关注有没有进程崩溃、磁盘 I/O 报错或者内核异常,这些记录能帮你省下大量瞎猜的时间。
服务器一切正常,但外面依然访问不了,那问题多半出在链路上。先用 ping 命令检测一下服务器公网 IP 的通畅程度。如果完全 ping 不通,可能机房网络中断,也可能是防火墙把 ICMP 协议给屏蔽了;如果能 ping 通,就继续查域名解析,用 nslookup 或者 dig 工具,核对 A 记录指向的 IP 是否和服务器实际公网 IP 一致。
这里有两个容易踩的坑需要留意。第一,如果你刚刚改过 DNS 记录,由于 TTL(存活时间)还没到期,全球生效需要等待一段时间,几小时到一天都有可能。第二,本地电脑或路由器的 DNS 缓存太旧,导致你访问的还是旧 IP。可以在命令行执行 ipconfig /flushdns 刷新一下缓存,或者临时把 DNS 改成 114.114.114.114 这种公共地址再试试。如果只是个别地区访问不了,大概率是 CDN 节点故障或线路抽风,得联系对应的服务商确认。
网络通了以后,排查重点就要放到 Nginx、Apache 或 IIS 这些 Web 服务软件上。打开错误日志,先搞清楚 HTTP 状态码在说什么:500 表示后端程序抛了没接住的异常,502 表示网关跟后端的 PHP-FPM 或 Tomcat 进程失联了,404 则是请求的文件或路径根本不存在。日志里通常会精确记录到具体的代码文件、报错行号和异常类型,比如 PHP 语法错误、Redis 连接超时等等。
遇到 502 错误,试着重启一下 PHP-FPM 或 uWSGI 进程,很多时候就能恢复通信。遇到 500 错误,则要重点排查伪静态规则文件(比如 .htaccess 或 web.config)是否有冲突,可以逐个注释掉可疑规则来缩小范围。特别提醒一下,修改完配置以后务必清理一下 opcache 或应用运行缓存再刷新页面,不然很容易误以为“改了没生效”,其实只是缓存还在捣乱。
动态网站的所有数据流转都靠数据库撑着,一旦数据库出问题,前台一般会白屏,或者直接弹出“数据库连接错误”的提示。登录数据库管理工具,第一步确认数据库服务进程是否存活,第二步查看连接数是否已经达到上限,第三步检查慢查询日志。
连接数被打满通常是因为程序有连接泄漏,或者某个页面并发请求过高。慢查询则需要针对执行时间特别长的 SQL 语句做优化,看看是不是缺索引或者表数据量太大。如果是数据库所在磁盘空间满了也会导致写入失败,你会看到前台能打开但是登录不了,或者发布文章报错。另外,云数据库的连接地址千万别配错,很多人迁移服务器后忘了改程序里的数据库连接配置,这种低级错误最浪费时间。
404 说明访问的路径在服务器上不存在。先确认 URL 是否输错,然后检查 Web 服务器的站点根目录配置是否正确,看看文件是否被移动过。如果是伪静态页面,要检查伪静态规则是否匹配当前路径,同时确认对应的 PHP 文件确实存在于目录中。
这种间歇性故障通常是资源临界导致的,比如内存快满了,系统在不断杀进程,或者数据库连接池不稳定。也可能是某些定时任务在固定时间点跑大量脚本,导致那个时段资源被占满。建议监控一下出现故障时段的资源占用和日志时间点,这个比猜测更靠谱。
绝大多数情况是缓存导致的。除了浏览器缓存,还要检查程序是否有 Opcache、Redis 或 Memcached 缓存,CDN 是否开启了页面缓存。建议先在无痕窗口测试,如果正常,那就是 CDN 或本地缓存的问题;如果没变化,那就清一下服务端缓存再刷新。
网站故障排查的核心就是“按顺序、看日志、先确认再动手”。建议你提前把这些排查步骤写成一份清单,平时做好系统监控和服务日志备份。真遇到问题了,按照服务器资源、网络解析、Web服务、数据库这个顺序一步步来,大多数故障都能在半小时内搞定,不用慌。