从 Windows 获取 err_connection_refused 在 wsl2 上访问 django 运行 但可以从 Windows 终端卷曲

Get err_connection_refused accessing django running on wsl2 from Windows but can curl from Windows terminal

我在尝试从 Windows 访问 wsl2 (http://localhost:8000) 上的 django 运行 时得到 err_connection_refused 但是当我使用 curl http://localhost:8000 从Windows 终端 bash,工作正常。我已尝试为端口 8000 添加新的防火墙入站规则,但它仍然无法正常工作。还有什么需要注意的吗

非常感谢

似乎是转发问题。 WSL2 的接口是 NAT 的,而 WSL1 是默认桥接的。 WSL 似乎做了一些“auto-forwarding”的端口,但只在本地主机上。然而,有时这种 auto-forwarding 机制似乎会“崩溃”。罪魁祸首似乎是休眠或 Windows 快速启动(它们都是 closely-related 功能)。

  • 如果您执行 wsl --shutdown 然后重新启动 WSL2 会话,问题是否会解决?如果是这样,请尝试 disabling Windows' Fast Startup。由于我系统上的另一个(non-WSL 问题),我已经禁用了快速启动,所以这可能与我 不能 能够重现的原因有关。

  • 同理,你休眠而不是关机吗?在这种情况下,wsl --shutdown 也可能会解析。

对于未来的读者,请注意以上两点似乎解决了大多数在评论中点赞和回复的人的问题。但是,如果这对您不起作用,以下是我最初的“附加建议”:

  • 有关其他想法,请参阅 this github issue。有一些关于可能需要的服务的建议。 (附带问题 - 你是 运行 Windows 家庭还是专业人士?)

  • 您的 Windows 主机文件(例如 c:\windows\system32\drivers\etc\hosts)是否有可能将本地主机指向 127.0.0.1 以外的 IP?如果我尝试通过我的本地 Windows IP 地址访问,而不是 127.0.0.1 或本地主机,我也会得到一个 ERR_CONNECTION_REFUSED。

  • 既然您查看了防火墙规则,也许查看转发规则而不仅仅是入站允许?

  • 如果其他所有方法均失败,请尝试 exporting/backing 启动 WSL2 会话(参见 wsl --export),然后将其作为新的 WSL1 会话导入。看看它在那里是否有效。

在我的 WSL2/Ubuntu 20.04 系统上,我尝试通过以下步骤重现(但还没有成功):

mkdir -p ~/src/dj-test
cd ~/src/dj-test
python3 -m venv dj
source dj/bin/activate
pip install Django
django-admin startproject config .
python manage.py runserver

(虽然我用了activate.fish因为我是运行鱼shell)

从 Windows 中的 Vivaldi 网络浏览器访问 localhost:8000,返回“安装成功!恭喜!...”

curl 在 Powershell Core 下也能正常工作。