排查小记(1):云服务器上 Nginx 本地能访问、公网却超时:一次完整的排查记录
一、问题现象
在一台 CentOS 云服务器上安装 Nginx 做测试,出现典型的“半通”现象:
- 服务器本机执行 curl http://localhost,正常返回 Nginx 欢迎页;
- 本地电脑浏览器访问 ECS 公网 IP,长时间无响应,最终提示连接超时。
已确认的三项前置条件:安全组入方向已放行 80 端口(源地址 0.0.0.0/0);firewalld 处于关闭状态;systemctl status nginx 显示 running。
二、排查思路
“本机通、外网不通”说明 Nginx 本身工作正常,问题出在流量到达 Nginx 之前的链路,或Nginx 只接受了本机流量。按由外到内、由简到繁的顺序排查。
1. 确认监听地址是否为 0.0.0.0
这是最高频的原因。执行:
ss -tuln | grep :80
若输出为 127.0.0.1:80,说明 Nginx 只绑定回环地址,外部 IP 的请求根本不会被受理。修改配置:
server {
listen 80;
server_name _;
...
}
然后 systemctl restart nginx。正常应看到 0.0.0.0:80 或 :::80。
2. 确认 80 端口被谁占用
systemctl status nginx 显示 running 并不等于成功监听了 80 端口,主进程存活但 worker 绑定失败的情况并不少见。执行:
lsof -i:80
netstat -tulnp | grep :80
核对进程名是否为 nginx。若被其他服务占用,停掉冲突进程后重启 Nginx。
3. 查看错误日志
tail -f /var/log/nginx/error.log
重点看 bind() to 0.0.0.0:80 failed (98: Address already in use) 这类绑定失败记录,它能直接区分“配置错误”和“端口冲突”。
4. 从客户端侧验证端口连通性
在本地电脑而非服务器上测试:
telnet 80 # Windows
nc -zv 80 # macOS / Linux
- 返回 Connection refused:端口未监听或服务异常,回到第 1、2 步;
- 返回 Connection timed out:报文被中间环节丢弃,需复查安全组是否真正生效、是否存在其他防火墙或网络 ACL。
三、结论
本次问题的根因是 Nginx 监听地址绑定在了 127.0.0.1,改为监听 80(即所有网卡)并重启后,公网访问恢复正常。
四、可复用的排查清单
1. 安全组 / 网络 ACL 是否放行目标端口;
2. 系统防火墙(firewalld / iptables / nftables)状态;
3. 服务是否监听 0.0.0.0 而非 127.0.0.1;
4. 目标端口是否被其他进程占用;
5. 服务错误日志是否有绑定失败或配置告警;
6. 客户端侧 telnet / nc 判断是 refused 还是 timeout;
7. 应用层是否有额外的 IP 白名单、SELinux 策略限制。
- 点赞
- 收藏
- 关注作者
评论(0)