通过 https://localhost:8000/ 访问时,本地主机拒绝在 WSL2 上连接,但在使用内部 WSL IP 地址时可以正常工作

Lus*_*awn 17 windows apache localhost symfony wsl-2

我想要实现的目标

在开发 Symfony Web 应用程序期间从我的本地计算机访问 localhost。

我的环境
  • 在 Windows 10 上运行的 WSL2
  • Linux、Apache2、MySQL、PHP-7.4 堆栈(安装了 Xdebug3)
  • Debian 10
  • Symfony 5.4(虽然不确定是否与此问题相关)
我已采取的步骤
#!/bin/sh
REMOTEIP=`cat /etc/resolv.conf | grep nameserver | sed 's/nameserver\s//'` 
sed -i -E "s/client_host=[0-9\.]+/client_host=$REMOTEIP/g" /etc/php/7.4/mods-available/xdebug.ini
service php7.4-fpm start
service apache2 start
service mysql start  
Run Code Online (Sandbox Code Playgroud)
  • symfony serve -d使用(Symfony 然后告诉我“Web 服务器正在使用 PHP FPM 7.4.23 https://127.0.0.1:8000”)在开发服务器上运行我的 Symfony 项目
  • 在运行应用程序的 Chrome 中转到 https://localhost:8000/
我期望发生什么
  • 当我在 Chrome 浏览器中访问 URL 时,我的 Symfony Web 应用程序将在 https://localhost:8000/ 上运行
实际发生的情况
  • 我收到“无法访问此站点,本地主机拒绝连接。” 在 Chrome 浏览器中
我尝试过的
  • 这种情况过去发生的频率较低,我会重新启动我的笔记本电脑,重复上述过程,然后我可以通过 https://localhost:8000/ 进行连接。然而,它现在拒绝更频繁地连接(比如我当天启动的 8/10 次)
  • 连接到https://127.0.0.1:8000会产生相同的结果。
  • 使用内部 WSL IP 地址连接到站点,发现使用hostname -I并用此 IP 替换 localhost(仍在端口 8000 上)。这是使用我的应用程序的充分解决方法,但是我无法通过 MySQL Workbench 与我的数据库交互,而不必设置新连接,因此修复我可以使用 localhost 的位置将非常有帮助!
  • (基于评论)仅symfony serve -d在不单独启动 apache 和 PHP 服务的情况下运行 - 有时仍然允许连接到本地主机,但有时不起作用。
结论

这种行为很奇怪,因为它有时有效,但有时在执行完全相同的步骤时却不起作用。我不确定还能在哪里寻找答案,而且我似乎无法在网上找到任何存在同样问题的内容。请让我知道是否有任何配置文件等会有帮助。非常感谢你的帮助!:)

Not*_*1ds 27

当它正常工作时,正如您清楚地意识到的,WSL2 的“localhost 转发”功能意味着您可以使用 Windows 主机的“localhost”地址访问 WSL2 内运行的服务。

然而,有时该功能会失效。众所周知,当您执行以下任一操作时,就会发生这种情况:

  • 休眠
  • 启用 Windows“快速启动”功能(这是默认设置)。快速启动是一种伪休眠,会引发同样的问题。

通常,最佳解决方案是禁用休眠和快速启动。但是,如果您确实需要这些功能,可以通过以下方式重置 WSL localhost 功能:

  • 退出任何 WSL 实例
  • 发行wsl --shutdown
  • 重新启动您的实例

根据我的经验,本地主机转发将在之后起作用。但是,如果没有,感谢@lwohlhart在评论中提到另一件事是在 WSL2 上禁用 IPv6,因为(我相信)应用程序有可能在 Windows->WSL2 连接时正在侦听 IPv6localhost正在 IPv6 上尝试连接。

您可以通过在Windows用户配置文件目录中创建或编辑以下内容,根据此 Github 评论禁用 WSL2 上的 IPv6 :.wslconfig

[wsl2]
kernelCommandLine=ipv6.disable=1
Run Code Online (Sandbox Code Playgroud)

wsl --shutdown完成更改需要重新启动。

如果您发现此方法有效,则可以通过确保在 Windows 端专门使用 IPv4 ( 127.0.0.1) 或 IPv6 ( ) 地址,或者将服务配置为侦听这两个地址来解决该问题。::1localhost

  • 只是想补充一点,帮助我解决的一件事是在`~/.wslconfig`中禁用我的wsl实例上的ipv6(https://github.com/microsoft/WSL/issues/9211#issuecomment-1331395957),否则应用程序运行 is wsl 显然会尝试通过已解析的本地主机 IP 的 ipv6 版本来响应 tcp 连接请求。这似乎导致了各种连接建立的麻烦。 (2认同)