WSL2 Ubuntu20.04+Docker环境Laravel启动后浏览器无法访问localhost问题
问题原因分析
- WSL2 端口转发异常:WSL2 与 Windows 宿主机的 localhost 端口转发机制偶尔会在系统重启、WSL 后台重置后失效,导致宿主机无法通过 localhost 访问 WSL 内运行的服务
- 服务绑定地址限制:此前启动服务时指定
--host=127.0.0.1,该地址仅允许 WSL 内部本地访问,此前的正常访问依赖 WSL 自动转发机制,转发失效后就会无法从 Windows 侧访问 - 旧进程挂死占用端口:后台运行的
artisan serve进程可能出现僵死状态,虽然进程仍在但已经无法响应请求,同时占用目标端口导致新启动的服务实际没有正常绑定端口 - Docker 端口映射冲突:如果 Laravel 服务运行在 Docker 容器内,可能出现容器端口映射失效、端口被其他宿主机服务占用的情况
解决方案
- 清理残留进程
先在 WSL Ubuntu 终端执行以下命令清理所有僵死的 PHP 进程,确认端口无占用:
pkill php lsof -i :8080 # 确认无输出即为端口未被占用
- 调整服务绑定地址
重新启动服务时绑定0.0.0.0,允许所有网段的请求访问:
php artisan serve --host=0.0.0.0 --port=8080
先不要加后台运行的 &,前台运行观察是否有请求日志输出,如果使用 Laravel Sail 作为 Docker 运行环境,直接执行 sail up 即可自动处理端口映射,无需手动运行 artisan serve。
此时可以尝试两种访问方式:
- 直接使用 WSL 内网 IP 访问:在 WSL 终端执行
ip addr show eth0,获取inet字段后的 IP 地址(格式通常为 172.x.x.x),在浏览器访问http://<WSL_IP>:8080 - 检查 Docker 配置:确认
docker-compose.yml中的端口映射配置,容器内 8000/8080 端口已正确映射到宿主机端口
- 修复 WSL localhost 转发
如果通过 WSL IP 可以正常访问,说明是 localhost 转发失效,可通过以下方式解决:
- 临时修复:在 Windows Powershell 执行
wsl --shutdown关闭 WSL,等待 10 秒后重新启动 WSL 即可恢复转发 - 永久方案:可在 WSL 内配置启动脚本自动将服务端口转发到宿主机,或直接使用 WSL IP 访问即可
- 补充验证
如果以上操作都无效,可以先在 WSL 内使用 curl 测试服务是否正常响应:
curl http://127.0.0.1:8080
如果有返回页面内容,说明服务本身正常,问题出在宿主机和 WSL 的网络连通上,可检查 Windows 防火墙是否阻止了 WSL 网段的访问请求。
相关截图


内容的提问来源于stack exchange,提问作者Jay.Smyth
相关产品推荐
相关产品推荐

