问题
内网设备,通过有公网IP的阿里云服务器实现内网穿透,阿里云服务器的10080端口映射到内网设备的80端口
在1panel面板中添加静态网站,例如我想通过公网IP:10080
访问,那么nginx的配置文件里需要监听这个公网IP:10080
,如果只监听内网IP:80
肯定是不可以的,会导致内网IP:80
可以正常访问但是公网IP:10080
访问时报nginx404
我在1panel中创建静态网站时填写的公网IP:10080
,在创建后补充了一个内网IP:80
,但是既不能通过公网IP访问,又不能通过内网IP访问
分析
是否为浏览器缓存问题
首先Ctrl+F5
强制刷新浏览器缓存,然后访问,报nginx404
然后打开无痕窗口再次尝试访问,报nginx404
基本可以排除浏览器缓存问题
查看配置文件
打开配置文件后一眼看出问题,配置文件内容如下:
报nginx404时的配置文件:
server { listen 10080 ; listen [::]:10080 ; server_name 8.XXX.XXX.xxx 192.168.0.105; index index.php index.html index.htm default.php default.htm default.html; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; access_log /www/sites/8.xxx.xxx.xxx/log/access.log main; error_log /www/sites/8.xxx.xxx.xxx/log/error.log; location ^~ /.well-known/acme-challenge { allow all; root /usr/share/nginx/html; } root /www/sites/8.xxx.xxx.xxx/index; error_page 404 /404.html;}
可以正常访问时的配置文件:
server { listen 80 ; listen [::]:80 ; listen 10080 ; listen [::]:10080 ; server_name 192.168.0.105 8.XXX.XXX.xxx; index index.php index.html index.htm default.php default.htm default.html; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; access_log /www/sites/192.168.0.105/log/access.log main; error_log /www/sites/192.168.0.105/log/error.log; location ^~ /.well-known/acme-challenge { allow all; root /usr/share/nginx/html; } root /www/sites/192.168.0.105/index; error_page 404 /404.html;}
第一个创建的过程:
- 设置公网中访问网站的IP和端口为
8.XXX.XXX.xxx:10080
,然后在「网站设置」>「域名设置」>「新增域名」,补充了192.168.0.105:80
第二个创建的过程:
- 设置访问网站的IP和端口为
192.168.0.105:80
,然后在「网站设置」>「域名设置」>「新增域名」,补充了公网IP+端口8.xxx.xxx.xxx:10080
实际得到的配置文件就是上面的两种,导致了完全不一样的结果
其实这里就能理解为什么不能完全依靠图形化界面了,就像这种,不能说图形化界面有问题,而是我和设计这个图形化界面的开发者有完全不一样的理解。我的理解是无论我创建时设置的是什么IP+端口,在后续需要新的IP+端口时应该是添加就有效的,至少图形界面中显示了就应该有效,而开发者则是默认觉得用户在创建时一定监听了80端口,所以后续添加时即使指定了80端口,也不会再向配置文件中添加80端口了。用户和开发者的思路是不一样的,这个时候还是自己改配置文件最稳妥,说到底图形化工具只能当作方便的工具,不能完全依靠图形化界面,还是要看自己在命令行这种原始环境中能不看出问题,能发现问题才能去解决问题,图形化界面可能恰恰让用户无法发现问题。
就拿这个问题举例:
创建时填写的IP+端口为:8.xxx.xxx.xxx:10080
后续添加192.168.0.105:80
后图形界面显示的状态:
配置文件中的状态:
而创建时填写192.168.0.105:80
,后续添加8.xxx.xxx.xxx:10080
时,图形界面中显示的状态:
配置文件中的状态:
图形化界面中我是觉得上下两种是等效的,可是实际在配置文件中完全不一样,就导致了出现两种结果。
问题复现
重新建一个网站,还是先添加公网IP+端口,后补充内网IP+80端口,依然报nginx404,说明我排查的结果是正确的,没有问题。