“网站打不开"是运维最高频的工单。别乱猜,按下面这条链路从外到内一层层排除,基本都能定位。
DNS 解析 → 网络可达 → 安全组/防火墙 → 端口监听 → 服务进程 → 应用日志
第一步:DNS 解析对不对
dig www.example.com # 查 A 记录
dig @8.8.8.8 www.example.com # 指定公共 DNS 查
nslookup www.example.com
- 解析不到 / 解析到错误 IP → 去 DNS 控制台看记录(A / CNAME)是否配置正确、是否生效(TTL 有缓存)。
- 本机
/etc/hosts会优先于 DNS,排查时先看它有没有写死:
cat /etc/hosts
cat /etc/resolv.conf # 本机用的 DNS 服务器
第二步:网络通不通、端口开没开
ping <IP> # ICMP 通不通(部分云默认禁 ping,不通不代表坏)
nc -vz <IP> 80 # 测试 TCP 80 是否可达
telnet <IP> 80 # 老式但直观
nc -vz超时 → 网络/安全组/防火墙挡了。- 通了但没响应 → 端口没服务在监听,进入下一步。
第三步:安全组与防火墙
云服务器有两层防火墙,都要查:
- 云安全组(云控制台):入方向是否放行了对应端口(如 80/443)。
- 系统防火墙(主机内):
sudo ufw status verbose # Ubuntu
sudo iptables -L -n # 看规则
常见坑:服务起来了、端口也监听了,但安全组没放行,外部就是连不上。
第四步:端口有没有在监听
ss -tlnp | grep -E ':(80|443)\b'
- 有监听 → 服务进程在,问题在内层。
- 没监听 → 服务没起或监听在别的地址/端口。
注意监听地址:0.0.0.0:80 是全接口可访问;127.0.0.1:80 只有本机能访问(外部连不上是正常的)。
第五步:服务状态与日志
systemctl status nginx
journalctl -u nginx --since "10 min ago"
tail -f /var/log/nginx/error.log
curl -I http://127.0.0.1/ # 本机自测
本机 curl 能通、外部不通 → 基本锁定是安全组/防火墙/监听地址问题。
一次完整排查示例
现象:
https://www.pilotechen.site打不开。
# 1. DNS
dig www.pilotechen.site +short # 有 IP,正常
# 2. 本机服务与端口
ss -tlnp | grep :80 # 0.0.0.0:80 在监听,正常
curl -I http://127.0.0.1/ # 200,服务本身 OK
# 3. 结论:服务正常 → 检查云安全组是否放行 80
# 到云控制台安全组,放行 TCP 80,问题解决
常用命令汇总
| 检查项 | 命令 |
|---|---|
| DNS 解析 | dig / nslookup |
| TCP 可达 | nc -vz IP 端口 / telnet |
| 监听端口 | ss -tlnp |
| 服务状态 | systemctl status |
| 日志 | journalctl -u / tail -f |
| 本机自测 | curl -I http://127.0.0.1/ |
记住顺序:先确认"通不通”,再确认"服务起没起",最后看"报什么错",别一上来就改配置。