游客发表
服务器上 curl http://127.0.0.1 返回 200,机可局域浏览器打开 http://192.168.1.100 却直接超时。访问访问这种事儿我遇到过不下十次,网内无法每次都是机可局域不同的原因。别急着改 nginx.conf,访问访问先搞清楚问题出在哪个环节。网内无法
最容易被忽略的机可局域是防火墙。CentOS 7 默认开着 firewalld,访问访问Ubuntu 那边是网内无法 ufw,很多人装完 nginx 测试本机通过就以为完事了。机可局域firewall-cmd --list-all 看一眼,访问访问80 端口没放行的网内无法话,局域网里其他机器根本连不上。机可局域我见过一个哥们折腾了一下午 nginx 配置,访问访问最后发现是网内无法 firewalld 没关。他的原话是“本机都能访问了,防火墙还能拦我不成”——还真能,本机走 loopback 接口,防火墙规则通常不拦 lo,但局域网流量走的是物理网卡,规则一视同仁。
nginx 的 listen 指令也经常出问题。默认配置写的是 listen 80;,这等于监听 0.0.0.0:80,所有网卡都收。但有些教程会让你改成 listen 127.0.0.1:80;,说是更安全。安全是安全了,局域网也彻底断了。检查方法很简单:ss -tlnp | grep nginx,看监听地址是 0.0.0.0 还是 127.0.0.1。如果是后者,改成前者再 reload。
还有一种情况是服务器有多块网卡,nginx 只绑了其中一块。比如内网 IP 是 192.168.1.100,但 nginx 配置里写了 listen 10.0.0.5:80;,那局域网当然访问不了。这种错误通常出现在从别的服务器复制配置的时候,IP 忘了改。
SELinux 也是个隐形杀手。CentOS 上 SELinux 默认 enforcing,nginx 想监听非标准端口或者访问某些目录会被直接拒绝。日志里能看到 Permission denied,但 nginx 的 error.log 不一定记录,得去 /var/log/audit/audit.log 里翻。临时用 setenforce 0 测试一下,如果问题消失,那就是 SELinux 的锅。永久解决要么关掉,要么用 semanage port -a -t http_port_t -p tcp 8080 这种命令放行。
网络层面的问题更隐蔽。局域网内其他机器 ping 得通服务器吗?如果 ping 都不通,那跟 nginx 没半毛钱关系,查交换机、VLAN、路由去。我碰到过一次,服务器和客户端在不同网段,中间隔了个路由器没配回程路由,ping 通但 TCP 握手失败。用 traceroute 和 tcpdump 抓包才定位到。
云服务器的话还要看安全组。阿里云、腾讯云的控制台里有个安全组规则,默认只开 22 和 3389。80 端口得手动加一条入站规则,授权对象填 0.0.0.0/0 或者你局域网的网段。这个跟系统防火墙是两码事,很多人只改了 firewalld 忘了安全组,结果还是不通。
排查顺序建议从外到内:先 ping 服务器 IP,通的话 telnet 端口,telnet 192.168.1.100 80 看能不能建立连接。连不上就是防火墙或安全组的问题。连得上但没响应,去查 nginx 监听地址和 SELinux。都正常的话,看 nginx 的 access.log 有没有记录到请求,没有记录说明流量根本没到 nginx,有记录但返回 4xx/5xx 就是应用层的事了。
别一上来就重装 nginx 或者重启服务器,那解决不了配置问题。按这个顺序走一遍,十分钟内基本能定位。
友情链接