获取 err_connection_refused 从 Windows 访问在 wsl2 上运行的 django,但可以从 Windows 终端卷曲
Posted
技术标签:
【中文标题】获取 err_connection_refused 从 Windows 访问在 wsl2 上运行的 django,但可以从 Windows 终端卷曲【英文标题】:Get err_connection_refused accessing django running on wsl2 from Windows but can curl from Windows terminal 【发布时间】:2020-12-06 15:55:59 【问题描述】:当我尝试从 Windows 访问在 wsl2 (http://localhost:8000) 上运行的 django 时,我得到了 err_connection_refused
,但是当我从 Windows 终端 bash 使用 curl http://localhost:8000
时,它工作正常。我尝试为端口 8000 添加新的防火墙入站规则,但仍然无法正常工作。还有什么需要我照顾的吗?
非常感谢
【问题讨论】:
【参考方案1】:似乎是转发问题。 WSL2 的接口是 NAT 的,而 WSL1 是默认桥接的。 WSL 似乎对端口进行了一些“自动转发”,但仅限于 localhost。然而,有时这种自动转发机制似乎“崩溃”了。罪魁祸首似乎是休眠或 Windows 快速启动(两者都是密切相关的功能)。
如果您执行wsl --shutdown
然后重新启动 WSL2 会话,问题是否会解决?如果是这样,请尝试disabling Windows' Fast Startup。由于我的系统上存在不同的(非 WSL 问题),我已经禁用了快速启动,因此这可能与我 无法重现的原因有关。
同样,您是休眠而不是关机吗?在这种情况下,wsl --shutdown
也可能会解决。
对于未来的读者,请注意,以上两点似乎解决了大多数在 cmets 中投票和回复的人的问题。但是,如果这对您不起作用,以下是我最初的“附加建议”:
有关其他想法,请参阅this github issue。有一些关于可能需要的服务的建议。 (附带问题 - 您运行的是 Windows 家庭版还是专业版?)
您的 Windows 主机文件(例如c:\windows\system32\drivers\etc\hosts
)是否有可能将 localhost 指向 127.0.0.1 以外的 IP?如果我尝试通过本地 Windows IP 地址而不是 127.0.0.1 或 localhost 进行访问,我也会收到 ERR_CONNECTION_REFUSED。
既然您正在查看防火墙规则,也许可以查看转发规则,而不仅仅是入站允许?
如果一切都失败了,请尝试导出/备份 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
,因为我正在运行鱼壳)
从 Windows 中的 Vivaldi 网络浏览器访问 localhost:8000
,返回“安装成功!恭喜!...”
curl
在 Powershell Core 下也能正常工作。
【讨论】:
感谢您的回答。我认为关闭是要做的事情。我还没有尝试过,但是我重新启动了计算机,并且端口 8000 的防火墙入站规则现在工作正常。 我也面临同样的问题。wsl --shutdown
并重新启动有效。我会尝试像你说的那样禁用windows fast startup
wsl --shutdown
+ 禁用 windows fast startup
+ 重启成功?
很高兴听到它对您有用。我还要说,虽然我在写答案时无法重现该问题,但从那时起我至少见过一次(可能两次)(即使禁用了快速启动)。当然,wsl --shutdown
也为我解决了这个问题。 WSL 似乎肯定会“失去”自动映射 localhost 端口转发的能力,但我不确定是什么触发了它。
我认为“快速启动”只是妨碍正常的 Windows 重新启动修复它。如果您禁用了快速启动,那么您可以重新启动 Windows,它应该可以解决。如果启用了快速启动,则问题在重新启动后仍然存在,并且需要 wsl --shutdown
。以上是关于获取 err_connection_refused 从 Windows 访问在 wsl2 上运行的 django,但可以从 Windows 终端卷曲的主要内容,如果未能解决你的问题,请参考以下文章
离子 4 网络::ERR_CONNECTION_REFUSED(http://localhost/)
失败:连接建立错误:net::ERR_CONNECTION_REFUSED
Angular6 - GET net::ERR_CONNECTION_REFUSED 的 HttpClient 错误处理
POST http://localhost:9000/net::ERR_CONNECTION_REFUSED