如何让Win10子系统Ubuntu上的Django+Vue应用通过公网IP访问
公网IP无法访问WSL部署应用的排查方案
按以下顺序逐步排查,先解决局域网访问问题,再推进公网访问验证:
1. 先验证局域网访问是否正常
用同一局域网内的其他设备访问 http://192.168.0.99,确认能否打开你的Django应用。如果局域网内都无法访问,优先解决本地网络链路问题。
2. WSL2 网络端口转发配置
WSL2默认采用NAT模式,内部IP与Windows主机局域网IP独立,需确保Windows主机端口能转发到WSL实例:
- 在Ubuntu子系统中执行
ip addr show eth0,记下inet字段对应的WSL内部IP(如172.x.x.x)。 - 以管理员身份打开Windows命令提示符,执行以下命令添加端口转发规则:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=80 connectaddress=你的WSL内部IP connectport=80 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=443 connectaddress=你的WSL内部IP connectport=443 - 验证规则是否生效:
netsh interface portproxy show all,确认存在对应80/443端口的转发条目。
3. Windows 防火墙放行端口
仅开放Ubuntu的ufw不足以让外部请求穿透Windows主机防火墙:
- 打开「Windows Defender防火墙 → 高级设置 → 入站规则」,新建规则:
- 规则类型选「端口」,下一步勾选TCP,指定本地端口
80,443; - 选择「允许连接」,勾选「域、专用、公网」;
- 命名规则后保存。
- 规则类型选「端口」,下一步勾选TCP,指定本地端口
4. Nginx 配置与运行状态检查
- 验证Nginx配置语法:
sudo nginx -t,确保无报错。 - 确认站点配置已启用:执行
sudo ln -s /etc/nginx/sites-available/SAFE_ERP /etc/nginx/sites-enabled/(若未执行过),然后重启Nginx:sudo systemctl restart nginx。 - 检查Nginx监听端口:
sudo ss -tulpn | grep nginx,确认存在LISTEN状态的0.0.0.0:80或103.122.201.91:80。 - 在Ubuntu内部访问
http://103.122.201.91,确认Nginx能正确路由到gunicorn服务。
5. Gunicorn 服务与权限检查
- 检查gunicorn服务状态:
确保两个服务均处于sudo systemctl status gunicorn.socket sudo systemctl status gunicorn.serviceactive (running)状态。 - 检查socket文件权限:
ls -l /run/gunicorn.sock,确保所属用户为bitrun、组为www-data,权限至少为rw-rw----(660)。若权限不符,在gunicorn.service的[Service]段添加UMask=0002,然后执行:sudo systemctl daemon-reload && sudo systemctl restart gunicorn.service
6. 公网IP 真实性与端口开放验证
- 确认公网IP一致性:执行
curl ifconfig.me,对比返回的IP与你Nginx配置中的103.122.201.91是否一致。若不一致,说明你的网络处于CGNAT(运营商级NAT)环境,需联系ISP申请公网IP,或使用内网穿透工具(如frp、ngrok)。 - 验证端口开放状态:使用在线端口检测工具输入80端口,确认端口是否对外可见。若显示关闭,检查路由器端口转发规则或防火墙配置。
7. 路由器端口转发规则确认
- 确保路由器端口转发规则中,
Internal Port为80,IP Address为Windows主机局域网IP192.168.0.99,Protocol为TCP(或All),且规则处于启用状态。 - 部分路由器需开启「虚拟服务器」或「DMZ主机」功能,确认相关设置已启用。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

