现象 Nginx 配置写好了,nginx -t 也通过了,systemctl reload nginx 没报错。
但浏览器访问,就是打不开。
Chrome:ERR_CONNECTION_CLOSED
curl:Connection timed out
Nginx 日志里什么都没有------请求根本没到 Nginx。
原因
bash
请求要想到达服务,要过三关:
用户浏览器
↓
① 云平台安全组(腾讯云/阿里云控制台配的)
↓
② 服务器防火墙(ufw / iptables)
↓
③ Nginx 是否监听对应端口
↓
服务
任何一关没放行,外部就访问不了。
而 Nginx 日志里没记录,恰恰说明请求在第一关或第二关就被拦了,根本没到 Nginx。
排查顺序 从内到外,一层层验证。 第一层:Nginx 有没有监听
bash
sudo ss -tlnp | grep 8443
LISTEN 0 511 0.0.0.0:8443 ... nginx
看到 0.0.0.0:8443 = Nginx 在监听所有网卡。
如果显示 127.0.0.1:8443 → 只监听本地,外部连不进来。检查 Nginx 配置里是不是写成了 listen 127.0.0.1:8443。 第二层:服务器本地能否访问
bash
curl -Ik https://127.0.0.1:8443
HTTP/2 200
✅ 200 → Nginx 本身正常,继续往下
❌ Connection refused → Nginx 有问题,回去看配置和日志 第三层:服务器自己的公网 IP 能否访问
bash
curl -Ik --connect-timeout 5 https://YOUR_SERVER_IP:8443
这一步很关键------它走公网,会经过云平台和服务器防火墙。
两种结果:
| 结果 | 说明 | 下一步 |
|---|---|---|
| ✅ 200 | 网络全通 | 问题在 DNS 或浏览器缓存 |
| ❌ 超时 | 被防火墙拦了 | 检查 ufw 和云安全组 |
| 第四层:检查服务器 ufw |
bash
sudo ufw status verbose
预期(能看到 8443 才算放行):
bash
To Action From
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
8081/tcp ALLOW Anywhere
8443/tcp ALLOW Anywhere ← 必须有
如果没有 8443 → 放行:
bash
sudo ufw allow 8443/tcp
⚠️ 放行前先确认 22/tcp 在列表里,否则可能把自己 SSH 也关掉。 第五层:检查云平台安全组 进腾讯云/阿里云控制台 → 你的实例 → 防火墙/安全组。
确认 8443 规则存在:
协议:TCP
端口:8443
来源:0.0.0.0/0
策略:允许
如果控制台已经放了,但访问还是不通 → 等 30 秒(规则生效有延迟),再试。 第六层:检查 DNS
nslookup YOUR_DOMAIN
预期返回你的服务器 IP。如果 NXDOMAIN → DNS 没配好。
第七层:检查浏览器缓存 浏览器本地也缓存 DNS。前面全通了但浏览器还打不开:
Chrome/Edge:打开 edge://net-internals/#dns → 点 Clear host cache
或直接开无痕窗口 三个坑 坑 1:只看云安全组,忘了服务器 ufw
云平台安全组放行了,但服务器自己的 ufw 没放行------请求到服务器就被拒了。两层都要查。
坑 2:改完 ufw 忘了 reload
ufw 是立刻生效的,不需要 reload。但如果你用的是 iptables 直接改,要 iptables-save。
坑 3:DNS 解析和端口放行是两件事
DNS 解析成功 ≠ 端口通。DNS 只负责"把域名翻译成 IP",端口通不通是另一层。排查时要分开看。