故障排查流程图
High Contrast
Dark Mode
Light Mode
Sepia
Forest
5 min read960 words

故障排查流程图

用结构化的思维框架处理故障,比随机尝试更快找到根因。


总体排查思路:分层定位

graph TD A[用户反馈站点有问题] --> B[确认问题范围] B --> C{只有你自己看到?} C -->|是| D[本地问题
清除缓存/换网络/换浏览器] C -->|否| E[确认全球还是局部] E --> F{全球都有问题?} F -->|是| G[从 DNS 层开始排查] F -->|否| H[局部问题
CDN 节点/ISP 问题] G --> I[DNS → 网络 → SSL → 应用 → 内容]

排查原则:从底层到上层,逐层排除。


完整排查流程

第一层:DNS 层

# 1. 域名能解析吗?
dig example.com A +short
# 无结果 → DNS 问题
# 2. 解析结果是否正确?
dig @8.8.8.8 example.com A +short
# 结果不是你的服务器 IP → DNS 记录错误或未传播
# 3. NS 记录是否正确?
dig example.com NS +short
# 不是你的 DNS 托管商 → NS 配置错误

第一层通过标准dig example.com A +short 返回正确的服务器 IP。


第二层:网络层

# 1. 服务器 IP 是否可达?
ping 203.0.113.5
# 超时/无响应 → 服务器宕机或防火墙拦截
# 2. TCP 端口是否开放?
nc -z -v 203.0.113.5 443
# Connection refused → 443 端口未监听
# 3. 路由追踪(找到在哪一跳出问题)
traceroute example.com

第二层通过标准:ping 有响应,443 端口可连接。


第三层:SSL 层

# 1. SSL 握手是否成功?
echo | openssl s_client -connect example.com:443 -servername example.com 2>&1 | head -20
# 看是否有 Verify return code: 0 (ok)
# 2. 证书是否过期?
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
# 3. 证书域名是否匹配?
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject

第三层通过标准:SSL 握手成功,证书有效,域名匹配。


第四层:应用层

# 1. HTTP 响应状态是否正常?
curl -s -o /dev/null -w "%{http_code}" https://example.com
# 200 → 正常
# 301/302 → 跳转(检查跳转目标是否正确)
# 4xx → 应用错误(路由/权限问题)
# 5xx → 服务器错误(应用崩溃/数据库连接失败)
# 2. 跳转是否正确?
curl -I http://example.com
# Location: https://example.com/ → 正确的 HTTP→HTTPS 跳转
# 3. 检查服务器日志
tail -100 /var/log/nginx/error.log
tail -100 /var/log/nginx/access.log | grep " 5[0-9][0-9] "

第四层通过标准:HTTP 200,应用正常响应。


快速诊断清单(60 秒版)

# 30 秒内完成基础诊断
echo "=== DNS ===" && dig example.com A +short
echo "=== HTTP ===" && curl -s -o /dev/null -w "%{http_code}" https://example.com
echo "=== SSL ===" && echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates 2>/dev/null
echo "=== Ping ===" && ping -c 3 example.com | tail -1

常见故障 → 根因速查表

症状 最可能的根因 第一个排查命令
DNS_PROBE_FINISHED_NXDOMAIN DNS 记录不存在 dig example.com A +short
ERR_CONNECTION_TIMED_OUT 服务器宕机/防火墙 ping example.com
ERR_CONNECTION_REFUSED 端口未监听 nc -z 203.0.113.5 443
NET::ERR_CERT_DATE_INVALID 证书过期 openssl s_client 查日期
NET::ERR_CERT_COMMON_NAME_INVALID 证书域名不匹配 检查证书 Subject
502 Bad Gateway 后端应用挂了 查 Nginx error.log
504 Gateway Timeout 后端响应太慢 查数据库/应用日志
邮件退信 SPF/DKIM 验证失败 MXToolbox SuperTool
部分地区打不开 CDN 节点问题/DNS 未完全传播 dnschecker.org

真实案例:一次完整的四层排查过程

场景:某电商站点从 GoDaddy 迁移域名到 Cloudflare 两天后,客户反馈"网站打不开",但运营人员在自己电脑上看是正常的。

第一步:确认问题范围

用户说"打不开",但我本地是好的 → 不是全局故障,是局部/传播问题

# 用 Google 的公共 DNS 检查
dig @8.8.8.8 example.com A +short
# 返回:104.21.xx.xx(Cloudflare IP,正确)
# 用本地 DNS 检查
dig example.com A +short
# 返回:203.0.113.45(GoDaddy 旧服务器 IP,错误!)

根因定位:本地 ISP 的 DNS 缓存仍在使用旧 NS 记录,TTL 还没过期。客户用的是同一 ISP,同样的缓存问题。

第二步:确认 NS 传播状态

dig example.com NS +short
# 返回:ns1.godaddy.com(还未切换到 Cloudflare!)

发现真正问题:NS 记录在域名注册商处没有保存成功(操作员以为保存了但其实没有)。这不是缓存问题,而是配置根本没生效。

修复步骤

  1. 登录 GoDaddy 域名管理,确认将 NS 改为 Cloudflare 的 4 条 NS 记录
  2. 等待 NS 传播(4–48 小时)
  3. 用 dnschecker.org 监控全球 NS 传播进度
  4. 传播完成后,用 dig 验证:
dig example.com NS +short
# → chloe.ns.cloudflare.com(正确)
dig @8.8.8.8 example.com A +short
# → 104.21.xx.xx(Cloudflare CDN IP)

结论:整个排查从"用户说打不开"到"确认根因是 NS 未保存"只用了 5 分钟,因为第一层就找到了差异(本地 DNS 和公共 DNS 返回不同结果)。分层排查的价值是排除无关因素,快速缩小问题范围。


常见误区

误区 正确做法
"清除浏览器缓存就解决了" DNS 缓存在操作系统层,浏览器缓存清除无效——需要 ipconfig /flushdns(Windows)或 sudo dscacheutil -flushcache(Mac)
"等 24 小时肯定传播完了" NS 变更传播时间取决于旧 NS 的 TTL,可能超过 48 小时——用 dnschecker.org 监控而非猜测
"本地访问正常就没问题" 本地 DNS 和全球 DNS 可能返回不同结果——总是用 dig @8.8.8.8 验证
"502 是 DNS 问题" 502 说明 DNS 和网络层都通了,是后端应用挂了——从 Nginx error.log 入手

本章执行清单


下一章电商与独立站运营实战——把所有知识用到 Shopify、Cloudflare、GitHub Pages 的实际配置中。