人人都能学编程
English 开始学习
核心 · 计算机网络第 5 课 / 共 6 课免费阅读

找出哪里坏了 · 计算机网络

网站挂了,从哪里查起?

课程目录

为什么需要它

「打不开」可能坏在任何一层:名字、网络路径、端口、服务、应用。乱猜会浪费好几个小时。自下而上一层一层地查,大多数问题几分钟就能找到,值班工程师就是这么做的。

直觉理解

按顺序问,在第一个「否」处停下:

  1. 名字能解析吗? dig +short 域名
  2. 机器能连通吗? ping 域名
  3. 服务有回应吗? curl -I 网址(被拒绝 → 没有程序在监听)
  4. 服务在运行吗? systemctl status 服务
  5. 它为什么停了? 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
逐步执行
  1. L1名字能解析。203.0.113.10
  2. L2机器有回应。
  3. L3Active: failed。坏的就是这一层。
  4. L4443 端口被另一个进程占了。

修复并确认

在互动课里运行

停掉占了端口的旧测试服务器,启动 web,再从外面检查一次。

ps
sudo systemctl stop old-web
sudo systemctl start web
curl -I https://shop.example.com
逐步执行
  1. L1old-web 正在运行,PID 1300。
  2. L2腾出端口。
  3. L4从外面看到 200 OK:修好了。HTTP/1.1 200 OK

常见错误

先重启再说

重启可能抹掉证据(失败原因的日志),而且修不了 DNS 或端口的问题。先看。

只在服务器内部测试

在服务器本机上 curl 能成功,用户却可能访问不了(防火墙、DNS)。一定要从用户所在的位置确认。

小测验

1. `dig +short shop.example.com` 什么都没打印。下一步查什么?

  1. A这个名字的 DNS 记录
  2. B网页服务器的日志
  3. C数据库
查看答案

答案:A

第一层就失败了:DNS 修好之前,谁也没法通过名字找到服务器。

2. 这段代码会输出什么?

systemctl status old-web
  1. A
    ● old-web.service - Old test server
         Loaded: loaded (/etc/systemd/system/old-web.service; disabled)
         Active: active (running)
  2. B
    ● old-web.service - Old test server
         Loaded: loaded (/etc/systemd/system/old-web.service; enabled)
         Active: active (running)
  3. C
    ● old-web.service - Old test server
         Loaded: loaded (/etc/systemd/system/old-web.service; disabled)
         Active: inactive (dead)
查看答案

答案:A

它现在在运行,但没有开机自启,重启后不会回来。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出哪一层?

    在脑子里运行一遍(或者按运行)。坏的是哪一层?

  2. 改需求好好修

    这里只是重启 web,结果又失败了,因为 old-web 还占着 443 端口。先腾出端口,让 web 跑起来、网站有回应。还要确保 old-web 不会回来:它本来就没开机自启,所以停掉就够了。

  3. 从零写跑一遍排查清单

    不改动任何东西,按顺序对 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.