网站突然无法访问是最紧急的线上故障之一。用户看到的是空白页或错误页,你看到的是监控告警,而根因可能在完全不同的层次——DNS 未生效、CDN 故障、服务器宕机、Nginx 崩溃、数据库挂掉,或者只是磁盘满了。
本文提供一套系统化的诊断流程,帮你在最短时间内定位根因并恢复服务。
一、故障快速分类
首先判断故障范围:
# 在多个地区测试网站是否可访问
# 工具:https://www.isitdownrightnow.com/
# 或使用命令行:
curl -I --connect-timeout 10 https://your-domain.com
| 现象 | 可能原因 | 优先排查 |
|---|---|---|
| 全球都无法访问 | 服务器宕机、DNS 故障、域名过期 | 服务器状态 → DNS |
| 国内无法访问,海外正常 | CDN 回源问题、线路故障 | CDN 状态 → 线路 |
| 部分页面报错,首页正常 | 特定功能依赖的服务(数据库、缓存)故障 | 数据库 → Redis |
| 网站响应极慢但未完全宕机 | CPU/内存耗尽、数据库慢查询 | 服务器资源使用率 |
二、第一步:检查 DNS 解析
# 检查域名是否正确解析到服务器 IP
nslookup your-domain.com
dig your-domain.com +short
# 检查 DNS 是否在全球范围内生效
# 工具:https://www.whatsmydns.net/
如果 DNS 解析结果不是你的服务器 IP,可能原因:
- 域名 DNS 记录被误删或修改
- 域名已到期被注销
- DNS 服务商故障
- 使用 CDN 时回源配置变更
域名是否过期
# 查看域名 Whois 信息,确认到期日期
whois your-domain.com | grep -i "expir"
三、第二步:确认服务器是否可达
# ping 服务器 IP(注意:部分服务器禁用 ICMP,ping 不通不一定表示宕机)
ping your_server_ip
# 测试 HTTP/HTTPS 端口是否开放
curl -I --connect-timeout 5 http://your_server_ip
telnet your_server_ip 80
telnet your_server_ip 443
如果服务器 IP 完全无响应,登录 VPS 控制面板检查服务器运行状态,必要时强制重启。
四、第三步:SSH 登录检查各项服务
能 SSH 登录后,按以下顺序检查:
检查系统资源是否耗尽
# 查看 CPU、内存、负载
top -bn1 | head -20
# 查看磁盘是否满了(这是最常见的原因之一)
df -h
# 查看内存使用
free -h
检查 Nginx 状态
# 查看 Nginx 是否在运行
sudo systemctl status nginx
# 查看 Nginx 错误日志(最近 50 行)
sudo tail -n 50 /var/log/nginx/error.log
# 测试 Nginx 配置并重载
sudo nginx -t && sudo systemctl reload nginx
检查 PHP-FPM 状态(WordPress 等 PHP 站点)
sudo systemctl status php8.1-fpm
sudo tail -n 30 /var/log/php8.1-fpm.log
检查 MySQL 状态
sudo systemctl status mysql
sudo tail -n 30 /var/log/mysql/error.log
# 尝试连接数据库
mysql -u root -p -e "SELECT 1;"
检查端口监听状态
# 确认 80 和 443 端口正在监听
sudo ss -tlnp | grep -E ':80|:443'
五、第四步:CDN 相关排查
如果使用了 Cloudflare 或其他 CDN:
# 直接访问源站 IP(绕过 CDN)
curl -H "Host: your-domain.com" http://your_server_ip
# 如果直接访问 IP 正常,但通过域名访问不正常
# 说明问题在 CDN 层,登录 Cloudflare 控制台检查
Cloudflare 常见问题:
- SSL/TLS 加密模式设置错误(建议选”完全(严格)”)
- 防火墙规则误拦截
- 回源 IP 被服务器防火墙拦截(确认放行 Cloudflare IP 段)
六、常见故障快速恢复命令
# Nginx 崩溃 → 重启
sudo systemctl restart nginx
# MySQL 崩溃 → 重启
sudo systemctl restart mysql
# PHP-FPM 崩溃 → 重启
sudo systemctl restart php8.1-fpm
# 磁盘满了 → 快速清理
sudo journalctl --vacuum-time=7d
sudo apt clean
docker system prune -f # 如果有 Docker
# 内存耗尽 → 找出占用最高的进程并重启
ps aux --sort=-%mem | head -10
七、建立监控避免下次被动发现
网站宕机最好的处理是在用户发现之前你就已经收到告警。推荐以下免费监控方案:
- UptimeRobot:免费监控 50 个站点,每 5 分钟检测一次,宕机立即发邮件/Telegram 通知
- Betterstack:免费版提供 3 分钟检测间隔,支持多渠道告警
- 自建监控:用 crontab 每分钟 curl 检测,失败时发送通知(参见方向十进阶运维篇)
总结
网站无法访问的排查顺序:DNS 是否正常解析 → 服务器是否可达 → 系统资源是否耗尽(磁盘/内存/CPU)→ Web 服务是否运行 → 数据库是否运行 → CDN 配置是否正确。按这个顺序依次检查,90% 的网站宕机故障可以在 15 分钟内定位并恢复。