WSL2 中网络服务访问 localhost

——以 hugo 为例

正常情况下,hugo 框架使用 hugo server 命令生成本地网络服务,并在 localhost:1313 下进行资源访问。我的 hugo 安装 WSL2 环境中,按照上述方法访问本地网络服务没有任何问题。但在一次重启后,Windows 浏览器访问 WSL2 上部署的 hugo 网络服务失败,显示 localhost 已拒绝连接。

网上一些资料说 WSL2 是一个虚拟环境,不能直接访问[1],资料给出的方案多半也是查询 ip 并直接访问 ip:端口

由于 WSL2 的 ip 是虚拟的,可能会变化,还需要写一个脚本获取 ip 以避免麻烦,我根据网上资料给出的解决方案也的确成功解决了问题。

但这种解决方案会导致在 vs code 终端中打开网络服务时因为 ip 变化而反复出现弹窗提示,这让我觉得有些难受。

令人不悦的弹窗◎ 令人不悦的弹窗

此外网络上也有资料说可以使用 localhost:端口号 的方式访问 WSL2 部署的网络服务[2],且我成功利用过这种方式访问过 WSL2 上部署的 hugo 服务。

所以我猜想可能是端口出现了问题,便尝试更换 hugo 的服务端口,果然成功利用 localhost:其他端口 打开 WSL2 上部署的 hugo 网络服务。

这下便找到了 WSL2 部署的网络服务突然不能访问 localhost 的真正原因,Windows 系统下的部分端口被占用了!

通过 netstat -aon|findstr "1313" 命令却发现并没有程序占用 1313 端口,但即使端口没有被占用,也可能是被系统保留(如: Hyper-V)从而不能访问。

于是使用 netsh interface ipv4 show excludedportrange protocol=tcp 检查 1313 端口是否在被保留,结果发现我们需要的 1313 端口的确被保留。

先暂时关闭 Hyper-V,然后使用 netsh int ipv4 add excludedportrange protocol=tcp startport=1313 numberofports=1 命令释放 1313 端口,最后重启 Hyper-V 便可以再次访问 localhost:1313

wls2中网络服务成功访问localhost◎ wls2中网络服务成功访问localhost


  1. 在 wsl2 中部署 hugo 环境 

  2. Windows 通过网络访问 WSL2