升级WSL2并配置Apache2虚拟主机后无法访问items.test求助
我刚帮几个朋友解决过一模一样的WSL2虚拟主机问题,核心原因是WSL2和WSL1的网络模型完全不一样,你踩的坑太典型了!咱们一步步排查:
WSL1是和Windows共享网络栈,所以127.0.0.1能直接映射到WSL的服务,但WSL2是跑在轻量虚拟机里,有自己独立的IP地址,Windows的127.0.0.1根本指向不到WSL2里的Apache。这是你最可能遗漏的点!
第一步:验证WSL2的IP地址
在WSL2的Ubuntu终端里执行:
hostname -I
会得到一个类似172.17.xxx.xxx的IP,这是WSL2的虚拟网卡IP。现在在Windows浏览器里直接访问这个IP,看看能不能打开Apache默认页。如果能打开,说明网络层面的问题就出在hosts映射上。
第二步:修正hosts文件
把Windows hosts里的127.0.0.1 items.test改成刚才拿到的WSL2 IP,比如:
172.17.123.45 items.test
然后刷新浏览器再访问items.test试试。
⚠️ 注意:WSL2重启后IP会变,如果你不想每次重启都改hosts,可以写个脚本自动更新,或者用Windows的端口转发(后面说)。
其他需要排查的点(如果上面改完还是不行)
1. 确认Apache监听所有接口
打开/etc/apache2/ports.conf,检查是否有一行:
Listen 80
而不是Listen 127.0.0.1:80。如果是后者,Apache只监听WSL2内部的localhost,Windows访问不到。改完后重启Apache:
sudo service apache2 restart
2. 检查Windows防火墙
Windows防火墙可能拦截了WSL2的80端口。你可以临时关闭防火墙测试一下,如果能访问了,就需要添加一条入站规则:
- 打开Windows Defender防火墙 → 高级设置 → 入站规则 → 新建规则
- 选择“端口” → 下一步 → 选择TCP,特定本地端口填80 → 下一步 → 允许连接 → 下一步 → 勾选所有网络类型 → 命名为“WSL2 Apache 80”
3. 检查/mnt/c目录的权限
WSL2访问Windows的C盘目录时,权限可能有问题。你可以先把测试文件放到WSL内部的目录(比如/var/www/html/test),修改虚拟主机的DocumentRoot到这个路径,然后重启Apache测试。如果能访问,说明是/mnt/c的权限问题。解决方法:
在WSL里执行:
sudo chown -R www-data:www-data /mnt/c/www/path/to/public sudo chmod -R 755 /mnt/c/www/path/to/public
另外,也可以修改WSL的挂载权限,在/etc/wsl.conf里添加:
[automount] options = "metadata,umask=0022,fmask=0022"
然后重启WSL(Windows终端执行wsl --shutdown,再重新打开Ubuntu)。
4. 确保虚拟主机确实生效
执行sudo a2dissite 000-default.conf(可选,避免默认站点干扰),然后sudo a2ensite items.test.conf,再sudo service apache2 restart,然后执行:
apache2ctl -S
查看输出里是否有items.test的虚拟主机配置,确认它已经被加载。
进阶:固定WSL2 IP或端口转发
如果不想每次重启WSL都改hosts,可以用端口转发:
在Windows的管理员PowerShell里执行:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=80 connectaddress=WSL2的IP connectport=80
这样Windows的127.0.0.1:80就会转发到WSL2的80端口,hosts里可以继续用127.0.0.1 items.test。
内容的提问来源于stack exchange,提问作者Fil

