找出哪里坏了 · 计算机网络
网站挂了,从哪里查起?
课程目录为什么需要它
「打不开」可能坏在任何一层:名字、网络路径、端口、服务、应用。乱猜会浪费好几个小时。自下而上一层一层地查,大多数问题几分钟就能找到,值班工程师就是这么做的。
直觉理解
按顺序问,在第一个「否」处停下:
- 名字能解析吗?
dig +short 域名 - 机器能连通吗?
ping 域名 - 服务有回应吗?
curl -I 网址(被拒绝 → 没有程序在监听) - 服务在运行吗?
systemctl status 服务 - 它为什么停了?
journalctl -u 服务
每一步都排除掉一整层,所以你绝不会因为 DNS 拼写错误去重启服务器。
定义
分层排查
Testing the network stack from the bottom (names, reachability) to the top (the application), so each test narrows where the fault is.从网络协议栈的底层(名字、连通性)往上(应用)逐层测试,每个测试都缩小故障所在的范围。
地址已被占用
A service can't listen on a port another process already holds. Find and stop the other process, or change the port.如果另一个进程已经占了某个端口,服务就没法在这个端口上监听。找到并停掉那个进程,或者换端口。
示例
按清单往下查
在互动课里运行名字和机器都没问题;是服务没回应。它的日志说明了原因。
dig +short shop.example.com
ping shop.example.com
systemctl status web
journalctl -u web逐步执行
- L1名字能解析。
203.0.113.10 - L2机器有回应。
- L3Active: failed。坏的就是这一层。
- L4443 端口被另一个进程占了。
修复并确认
在互动课里运行停掉占了端口的旧测试服务器,启动 web,再从外面检查一次。
ps
sudo systemctl stop old-web
sudo systemctl start web
curl -I https://shop.example.com逐步执行
- L1old-web 正在运行,PID 1300。
- L2腾出端口。
- L4从外面看到 200 OK:修好了。
HTTP/1.1 200 OK
常见错误
先重启再说
重启可能抹掉证据(失败原因的日志),而且修不了 DNS 或端口的问题。先看。
只在服务器内部测试
在服务器本机上 curl 能成功,用户却可能访问不了(防火墙、DNS)。一定要从用户所在的位置确认。
小测验
1. `dig +short shop.example.com` 什么都没打印。下一步查什么?
查看答案
答案:A
第一层就失败了:DNS 修好之前,谁也没法通过名字找到服务器。
2. 这段代码会输出什么?
systemctl status old-web查看答案
答案:A
它现在在运行,但没有开机自启,重启后不会回来。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出哪一层?
在脑子里运行一遍(或者按运行)。坏的是哪一层?
- 改需求好好修
这里只是重启
web,结果又失败了,因为old-web还占着 443 端口。先腾出端口,让web跑起来、网站有回应。还要确保old-web不会回来:它本来就没开机自启,所以停掉就够了。 - 从零写跑一遍排查清单
不改动任何东西,按顺序对
shop.example.com做前四项检查:解析名字(dig +short)、ping 它、看web服务的状态、读它的日志。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Troubleshooting | 故障排查 | Finding the cause of a problem by testing one possibility at a time. |
| Connection refused | 连接被拒绝 | The machine answered, but nothing listens on that port. |