nginx无法访问或者超时,教你一步步排除
问题:
curl http://localhost:81
本机访问没问题,
但其他机器访问这个服务器的 81 端口却 超时。
这是一个非常典型的网络或防火墙问题。我们来一步步排查。
✅ 现象总结
测试方式 | 是否成功 | 说明 |
---|---|---|
本机访问(localhost:81 ) |
✅ 成功 | Nginx 正常运行、监听端口正常 |
其他机器访问(IP:81) | ❌ 超时 | 外部无法连接到该端口 |
🔍 排查步骤
1. ✅ 确认 Nginx 监听的是 0.0.0.0
而不是 127.0.0.1
检查 Nginx 的配置是否监听了外部 IP 地址:
ss -tuln | grep 81
输出示例:
tcp6 0 0 :::81 :::* LISTEN
或者:
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN
✅ 正确:监听在 0.0.0.0:81
或 :::81
(IPv6)
❌ 错误:监听在 127.0.0.1:81
—— 只允许本地访问!
🔧 解决方法:修改 Nginx 配置文件中的 listen
指令:
server {
listen 81; # 默认等价于 listen 0.0.0.0:81;
...
}
然后重启 Nginx:
systemctl restart nginx
2. ✅ 确认 iptables/firewalld 是否放行了 81 端口
你之前查看过 iptables
,确认一下是否放行了 TCP 81 端口:
iptables -L -n -v | grep :81
如果没有看到类似这一行:
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
那就需要添加这条规则:
sudo iptables -A INPUT -p tcp --dport 81 -j ACCEPT
保存规则(CentOS 7):
service iptables save
实际上,我就是这里出的问题
因为iptables的规则是从上到下的,匹配成功就返回
因此,我的INPUT表中有一行
REJECT all
所以,才会一直超时,
删除,
iptables -D INPUT -n
n就是要删除的行号,
删除之后,自然就能访问了!
或者如果你使用的是 firewalld
:
sudo firewall-cmd --permanent --add-port=81/tcp
sudo firewall-cmd --reload
3. ✅ 检查服务器的网卡是否绑定了正确的 IP 地址
确保你的服务器有公网或局域网 IP,并且可以通过网络访问。
查看 IP 地址:
ip addr show
例如:
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500...
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0
你可以从其他机器尝试 ping 这个 IP:
ping 192.168.1.100
如果 ping 不通,那可能是网络连接问题(交换机、防火墙、子网设置等)。
4. ✅ 检查服务器是否开启了 TCP 81 端口(从远程测试)
从客户端机器测试端口是否开放:
telnet 192.168.1.100 81
# 或者:
nc -zv 192.168.1.100 81
如果显示:
succeeded!
:表示端口开放Connection refused
:端口没开或服务没启动Connection timed out
:被防火墙阻挡或服务器没响应
5. ✅ SELinux / AppArmor 是否阻止访问?
虽然较少见,但 SELinux 有时也会阻止非标准端口(如 81)的服务。
临时禁用 SELinux 测试:
setenforce 0
然后再从客户端访问看看是否能成功。
⚠️ 注意:这只是临时禁用,重启后会恢复。
要永久关闭,需修改 /etc/selinux/config
文件。
6. ✅ 查看系统日志排查问题
查看系统日志,可能会发现连接被拒绝的原因:
tail -f /var/log/messages
# 或:
journalctl -f
也可以只查看与 iptables 相关的记录:
grep "IN=" /var/log/messages | grep "DPT=81"
🧠 总结:为什么本机能访问,别人不行?
原因 | 说明 | 解决方案 |
---|---|---|
Nginx 监听地址是 127.0.0.1 |
只允许本机访问 | 改为 listen 81; |
防火墙未放行 81 端口 | 请求被丢弃 | 添加 iptables 或 firewalld 规则 |
客户端无法访问服务器 IP | 网络不通 | 检查 ping、交换机、路由 |
SELinux/AppArmor 阻止访问 | 较少见 | 暂时关闭测试 |
服务器端口未监听 | 服务没启动或配置错误 | 检查 ss -lnt 和重启服务 |
🛠️ 快速验证命令清单(建议收藏)
# 1. 检查 Nginx 是否监听 81
ss -tuln | grep 81
# 2. 检查 iptables 是否放行 81
iptables -L -n -v | grep :81
# 3. 检查 firewalld 是否放行 81
firewall-cmd --list-all | grep 81
# 4. 检查 SELinux 状态
getenforce
# 5. 从客户端测试端口是否开放
telnet <服务器IP> 81
nc -zv <服务器IP> 81
# 6. 查看日志
tail -f /var/log/messages