本地网络内无法通过Nginx反向代理访问网站的问题求助
看起来你遇到了本地网络内通过域名访问Nginx反向代理服务的超时问题,我来帮你梳理几个可能的排查方向和解决办法:
一、检查Nginx的监听地址
你的Nginx配置里listen指令大多只指定了端口(比如listen 443 ssl;、listen 80;),默认情况下Nginx会监听0.0.0.0(所有网卡的对应端口),但如果不小心配置成仅监听公网网卡IP,就会导致本地局域网请求无法连接。
你可以在服务器上执行以下命令查看Nginx的监听状态:
ss -tulpn | grep nginx
如果输出里的监听地址不是0.0.0.0:80和0.0.0.0:443,而是某个特定的公网IP,那需要修改Nginx配置,把listen指令明确写成listen 0.0.0.0:80;(或listen 80;,效果一致)、listen 0.0.0.0:443 ssl;,重启Nginx后再测试。
二、排查本地DNS解析与NAT回环问题
虽然你能ping通域名,但本地机器可能把域名解析到了服务器的公网IP,而路由器的NAT回环功能可能存在细节问题(比如对HTTP/HTTPS流量的处理异常)。
你可以先做个快速验证:
- 在服务器本地的
/etc/hosts文件中添加以下记录(替换成你的服务器本地局域网IP):
192.168.x.x my.website.com service1.website.com api.website.com
- 在本地局域网内的机器上,也修改
hosts文件(Windows是C:\Windows\System32\drivers\etc\hosts),添加同样的记录。
修改后再尝试访问域名,如果能正常访问,说明问题出在DNS解析或路由器NAT回环的配置上,你可以:
- 检查路由器的NAT回环(Hairpin NAT)功能是否确实开启;
- 考虑在本地DNS服务器(如果有的话)添加域名到服务器本地IP的解析记录,替代公网IP解析。
三、重新检查防火墙/iptables规则
即使你之前检查过防火墙,也可能存在遗漏:比如防火墙规则仅允许公网接口的80/443端口流量,而拒绝了本地局域网的请求。
你可以在服务器上执行以下命令查看iptables的INPUT链规则:
iptables -L -n
查看是否有针对80和443端口的规则,是否限制了来源IP。如果发现规则仅允许公网IP段访问,需要添加允许本地局域网段(比如192.168.1.0/24)访问的规则:
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 443 -j ACCEPT
也可以临时关闭防火墙(比如systemctl stop firewalld或service iptables stop)测试,如果关闭后能访问,就说明是防火墙规则的问题。
四、检查Nginx配置的细节问题
看你的配置,api.website.com的PHP处理块里有个小错误:
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # Adjust this to your PHP-FPM socket path/version
这里注释内容被换行拆分了,虽然这个错误只会影响API服务的PHP解析,不会导致超时,但建议修正为:
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # Adjust this to your PHP-FPM socket path/version
另外,确认my.website.com反向代理的http://127.0.0.1:8086服务确实在监听127.0.0.1:8086,可以用ss -tulpn | grep 8086查看,确保服务正常运行。
五、测试HTTP与HTTPS的差异
分别测试本地访问http://service1.website.com(HTTP)和https://my.website.com(HTTPS):
- 如果HTTP能访问但HTTPS超时,可能是路由器对HTTPS的NAT回环处理有问题,或者Nginx的SSL配置存在本地访问的兼容性问题;
- 如果两者都超时,那问题大概率出在Nginx监听、防火墙或路由器NAT回环的核心配置上。
备注:内容来源于stack exchange,提问作者Just Bucket

