网站突然打不开,大多数人的第一反应就是刷新页面。连续刷新三次依旧加载转圈,心里就会紧张。服务器故障排查逻辑本身并不复杂,由外向内逐层定位,先锁定故障所属环节,再深入排查。
第一步先确认故障范围,判断是不是只有本机无法访问。打开手机流量访问站点,或者使用站长工具Ping检测,多地域测试域名。全国多地访问超时,就是服务器端故障。只有自己无法打开,大概率是本地DNS缓存或者运营商网络问题,切换网络重试即可。这一步耗时很短,能排除大量误判。
确认问题在服务器端之后,先查看服务器实例状态。登录云服务商控制台,查看实例是否处于运行状态。状态显示停止或者异常,优先重启实例。重启可以解决很多临时故障,内存溢出导致进程终止、系统负载过高卡死这类问题都能修复。重启之后恢复访问,但短时间内再次故障,说明存在底层问题,需要继续排查。

控制台还有几项指标需要快速查看。CPU占用是否达到100%,内存占用是否接近上限,带宽是否跑满。三项资源任意一项打满,网站都会无法访问。CPU、内存问题大多来自程序,PHP脚本死循环、数据库查询缺少索引触发全表扫描,或是爬虫高频抓取都会造成。带宽占满原因有所区别,有可能遭遇CC攻击,也可能页面大量转发带来流量激增。控制台带宽实时曲线如果长期顶到上限,基本判定是攻击或者流量刷量。
服务器状态正常,CPU内存资源充足,但网站依旧无法打开,故障大概率出在Web服务。检查Nginx或者Apache运行状态,执行 systemctl status nginx。服务停止,查看错误日志,/var/log/nginx/error.log一般会记录故障原因。常见诱因包含配置文件修改错误造成重载失败、端口占用、SSL证书过期导致启动报错。修改配置之后,先用 nginx -t 校验语法,校验通过再重载,这个习惯能减少很多麻烦。
数据库属于高频故障点。网站页面部分加载,或者页面提示“Error establishing a database connection”,基本就是MySQL停止或者连接失败。先确认MySQL服务运行状态,再检查磁盘空间。数据库服务器磁盘占满属于隐蔽且常见故障,日志、临时文件、binlog填满磁盘之后,MySQL停止写入,网站随之失效。执行df -h查看磁盘使用率,占用超过90%就要清理数据。
DNS故障很容易忽略,排查操作简单。使用 dig 或者 nslookup 查询域名解析IP,对比服务器真实公网IP。两者不一致代表解析记录被改动或是过期,进入域名控制台重新配置A记录。还有一种情况是域名忘记续费过期,注册商停止解析。这类失误一次就足够留下深刻印象,开启自动续费可以规避。
SSL证书过期是另一类高发问题,容易被忽视。现代浏览器会直接拦截证书过期站点,弹出警告页面,访客无法进入。证书有效期一般一年,Let's Encrypt证书有效期三个月,到期前完成续期。执行 openssl s_client -connect 你的域名:443 查看证书到期时间,也可以点击浏览器地址栏锁图标查看。宝塔面板或是云服务商控制台都自带证书续期工具,一键即可操作。
以上排查项全部正常,网站依旧无法访问,就要查看程序日志。PHP错误日志、应用运行日志、框架日志文件,记录详细报错信息。常见情况包含插件更新后和主程序不兼容、代码硬编码路径和新服务器环境不匹配、外部API服务中断造成页面超时。程序层面排查耗费时间最长,但日志会给出线索,检索报错信息,大多能找到同类问题的解决方案。
还有一类特殊场景,网站可以打开,但是加载极慢。这个和完全无法访问属于两类故障,排查方向不一样。访问缓慢大多和数据库查询相关,慢查询日志可以定位耗时过长SQL语句。图片未压缩、JS和CSS没有合并、服务器未开启缓存同样拖慢速度。打开浏览器开发者工具Network面板,定位耗时最长请求,就能锁定问题源头。
遭受攻击场景单独说明。网站突然无法访问,控制台带宽、CPU占用飙升,访问日志内单一IP或者User-Agent请求量异常巨大,基本判定遭遇CC或者DDoS攻击。临时处理方式是防火墙或者Nginx封禁对应IP段,长期方案部署CDN或是高防服务。攻击流量规模大的时候,单台服务器无法承载,需要联系服务商切换高防线路。
排查要有固定顺序,从网络到服务器、服务、程序逐层排查,不要跳步骤。很多人直接怀疑程序bug,花费大量时间调试代码,最后发现只是磁盘空间耗尽。优先确认底层资源状态,再向上排查,节省大量时间。日志是最可靠的参考,遇到看不懂报错,复制关键内容检索,大部分故障都有人提前踩坑。