
用户说网站打不开。你上去一看,服务器CPU正常,内存够用,磁盘没满,Nginx也在跑。
那问题在哪?
在网络上。网络问题是服务器故障里最难查的,因为它不在你的服务器里,在服务器和用户之间。你看不到,只能靠命令去猜。
今天教你一套命令,从用户到服务器的完整链路,每一步都能查。
先看一个数据
某云厂商统计,超过30%的“服务器故障”投诉,根源不在服务器,在网络。用户连不上、打开慢、时而好时而坏——这些问题里,很大一部分是网络丢包、路由绕路、DNS解析错误导致的。
你在服务器上查不到,因为你的服务器一切正常。问题在路上。
第一步:先确认是服务器问题还是网络问题
在服务器上敲:
bash
curl -I 127.0.0.1
如果返回200,说明服务器自己访问自己正常。如果这里都打不开,那就是服务器本身的问题(Nginx挂了、防火墙拦了)。
如果本地正常,从外面访问不正常,那就是网络问题。继续往下查。
第二步:ping —— 测连通性和延迟
bash
ping 你的服务器IP
看三样东西:
- 丢包率:100%就是不通,0%最好
- 平均延迟:国内30-50ms正常,跨国的100-200ms正常
- 延迟波动:忽大忽小说明网络不稳定
反常识点:ping不通不等于网站打不开。很多服务器禁ping,为了安全。如果你ping不通但网站能打开,说明服务器禁ping了,正常。
第三步:traceroute/mtr —— 看数据包走了哪条路
ping只能告诉你“堵了”,traceroute能告诉你“堵在哪”。
bash
traceroute 你的服务器IP
会列出从你的电脑到服务器经过的每一跳(路由器)。每一跳的延迟都能看到。
如果某一跳突然延迟飙升,或者连续几个星号(超时),说明问题出在那附近。
更好用的工具:mtr
bash
mtr 你的服务器IP
mtr把ping和traceroute合在一起,实时显示每一跳的丢包率和延迟。按q退出。
看mtr的结果:
- 如果某一跳丢包高,但后面几跳恢复了,那是那台路由器在限速,不是真丢包
- 如果从某一跳开始丢包一直持续到最后,那就是真丢包了
第四步:telnet/nc —— 测端口是否开放
ping测的是IP通不通,但网站用的是80(HTTP)和443(HTTPS)端口。IP通了,端口不一定通。
bash
telnet 你的服务器IP 80
如果显示Connected,说明端口通。如果卡住或显示Connection refused,说明端口没开。
Windows默认没装telnet,可以用Test-NetConnection或者装个Putty。
Linux替代命令:
bash
nc -zv 你的服务器IP 80
-z是只测连接不发送数据,-v显示详细信息。
第五步:nslookup/dig —— 测DNS解析
用户访问example.com,首先要通过DNS把域名转成IP。如果DNS解析错了,用户就去错地方了。
bash
nslookup 你的域名
看返回的IP是不是你的服务器IP。不是的话,去域名控制台改解析。
bash
dig 你的域名
信息更详细,能看到DNS服务器的响应时间。如果响应时间超过100ms,说明DNS服务器慢,可以考虑换一个(比如Cloudflare的1.1.1.1)。
反常识点:很多时候“网站打不开”是因为你刚改了解析,你本地的DNS还没更新。换手机网络试试,或者清DNS缓存。
第六步:curl —— 测HTTP请求
前面都是网络层,curl测的是应用层。模拟浏览器发一个HTTP请求,看服务器怎么响应。
bash
curl -I https://你的域名
-I只返回响应头,不返回正文。看第一行:
200 OK:正常301/302:重定向,正常403:权限问题500/502/503/504:服务器内部错误
还可以测响应时间:
bash
curl -o /dev/null -s -w 'Total: %{time_total}s\n' https://你的域名
返回总耗时。如果超过1秒,说明服务器处理慢,去优化代码或数据库。
第七步:netstat/ss —— 看本机网络状态
前面的命令都是测外面到服务器,netstat是看服务器自己。
bash
netstat -tunlp
列出所有监听的端口。看80和443在不在。不在的话,Nginx没启动或配置错了。
bash
ss -tunp | grep ESTAB
看当前有多少活跃连接。如果成千上万,可能被攻击了。
第八步:综合排查流程图
从用户输入网址到看到页面,完整链路:
- 用户电脑 → DNS服务器:解析域名
- 命令:
nslookup、dig - 问题:解析出的IP不对、解析慢
- 命令:
- 用户电脑 → 服务器:网络传输
- 命令:
ping、mtr、traceroute - 问题:丢包、延迟高、路由绕路
- 命令:
- 用户电脑 → 服务器端口:TCP连接
- 命令:
telnet、nc - 问题:端口不通、防火墙拦截
- 命令:
- 服务器 → Web服务:HTTP处理
- 命令:
curl、curl -I - 问题:Nginx挂了、返回错误码
- 命令:
- 服务器内部:应用代码、数据库
- 命令:
top、查日志、看监控 - 问题:代码慢、数据库慢
- 命令:
按这个顺序查,90%的网络问题都能定位。
一个真实案例
有次一个朋友说他的网站“时而能打开,时而打不开”。我让他用mtr跑了一分钟,发现从某省电信节点开始丢包30%,持续到服务器。
判断:省电信骨干网拥堵。他联系云厂商,云厂商协调运营商调整路由,问题解决。
如果他没有查网络,可能会花一星期折腾服务器配置。
最后一句
网络问题排查,最难的不是技术,是“看不见”。数据包从用户到服务器,中间几十跳,你一台都看不到。
但命令是你的眼睛。ping看通不通,mtr看堵在哪,telnet看端口开没开,curl看服务正不正常。
一套命令走下来,问题在哪,一目了然。
下次用户说“网站打不开”,先别登服务器。从你的电脑开始,一步一步查。




