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

posted @ 2025-06-20 21:47  aidengduff  阅读(281)  评论(0)    收藏  举报