访问网络应用程序

访问网络应用程序

从周一开始,每次我需要调用Chrome 时,即使我可以看到它,localhost它也会说不可用。我已经尝试过:ping

  • 删除 Chrome dns 缓存
  • 删除 Firefox dns 缓存
  • 删除 Windows 缓存

经过网上的一些研究和测试后,我发现ipconfig /flushdns重新启动计算机后就可以重新开始工作了。

问题是,问题每天都存在,我现在的日常工作是:

  • 打开电脑
  • ipconfig /flushdns通过windows终端执行
  • 重启电脑
  • 通过 WLS2 运行应用程序

这是不可持续的,有办法让它永久发挥作用吗?

这是我的主机文件:

# localhost name resolution is handled within DNS itself.
127.0.0.1       localhost
::1             localhost

# Added by Docker Desktop
192.168.X.X host.docker.internal 
192.168.X.X gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section

编辑:该应用程序在 wsl2 上的 ubuntu 子系统中运行,浏览器在 Windows 上运行。

编辑:这是应用程序打印的内容(它是一个 django 应用程序):

Performing system checks...

System check identified no issues (5 silenced).
April 14, 2021 - 07:00:43
Django version 2.2.16, using settings 'geonode.local_settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

这是 Chrome 的截图:

在此处输入图片描述

翻译:

Unable to reach the website. 
Connection refused for localhost.
Try to:
- verify connection
- check proxy and firewall
ERR_CONNECTION_REFUSED

测试的网址:

http://127.0.0.1:8000/
http://localhost:8000/

答案1

根据您的描述,我猜测您遇到的问题是由于某些东西(可能是 kubernetes)覆盖了 Windows 主机文件中的 127.0.0.1 条目 [请注意,这与 Windows Linux 子系统中的 ubuntu 主机文件有根本区别],然后当 Windows Linux 子系统启动 ubuntu 服务器时,它会从该文件创建自己的主机条目,并创建自己的不正确的环回主机名。

稍后,Windows 主机文件的 localhost 条目被覆盖为 myth2.localdomain,当您尝试在浏览器中访问 localhost 时,它会查找 myth2.localdomain 并将请求发送到 ubuntu 主机,仅在 localhost 上监听 myth.localdomain,并且请求失败。

您刷新 DNS 并重新启动,两个系统都有相同的主机文件,请求暂时有效。

您可以通过两种方式避免这种情况。

首先让你的 ubuntu 应用程序监听 0.0.0.0:8000 (绑定到所有地址,而不仅仅是本地主机)

第二步,获取 ubuntu 系统的 ip 地址或主机名,在 windows 机器上使用该地址和 ubuntuapp.whatever.com 创建主机文件条目,然后在浏览器中使用该 URL

但是你是对的,这是不可持续的,并不是因为 Windows Linux 子系统,而是因为你的应用程序正在监听一个特定的地址,这个地址从你的 Windows 机器上抽象了一层,而这个地址对正在被其他东西覆盖。

答案2

经过多次尝试和修补后,唯一有效的方法是禁用fast startupWindows 设置中的

答案3

今天早上,我偶然发现了类似的问题,当时我试图从 Windows 10 浏览器访问在 WSL2 进程中运行的 Jupyter 实例。虽然curl从 WSL2 控制台找到该实例,但浏览器报告了连接错误。

经过几次失败的尝试,我终于找到了适合我的情况的方法。由于我怀疑我的安装已过时,我尝试通过 CLI 手动更新:

C:\Windows>wsl --update
Checking for updates...
The Windows Subsystem for Linux kernel can be manually updated with 'wsl --update', but automatic updates cannot occur due to your system settings.
To receive automatic kernel updates, please enable the Windows Update setting: 'Receive updates for other Microsoft products when you update Windows'.
For more information please visit https://aka.ms/wsl2kernel.

显然,WSL2 不是 Windows10 常规发行版的一部分,而是属于“其他 Microsoft 产品”,出于未知原因,我禁用了相关的更新选项。很可能我在一段时间前就禁用了它,所以我运行的是一个过时的版本——除了本地主机问题外,它运行正常。

就像 WSL2 cli 中所述,必须在 上启用此功能Windows Update > Advanced options > Receive Updates for other Microsoft products when you update Windows。启用它后,我终于收到了 WSL2 更新,并且本地主机问题已修复。我目前正在运行5.10.60.1-microsoft-standard-WSL2Windows 10 版本 19042。

答案4

访问网络应用程序

来自微软的合法复制/粘贴

从 Windows(localhost)访问 Linux 网络应用程序

如果您在 Linux 发行版中构建网络应用程序(例如在 NodeJS 或 SQL 服务器上运行的应用程序),则可以使用 localhost 从 Windows 应用程序(如 Edge 或 Chrome 网络浏览器)访问它(就像平常一样)。

但是,如果您运行的是旧版本的 Windows(Build 18945 或更低版本),则需要获取 Linux 主机 VM 的 IP 地址(或更新到最新的 Windows 版本)。

要查找支持你的 Linux 发行版的虚拟机的 IP 地址:

From your WSL distribution (ie Ubuntu), run the command: ip addr
Find and copy the address under the inet value of the eth0 interface.
If you have the grep tool installed, find this more easily by filtering the output with the command: ip addr | grep eth0
Connect to your Linux server using this IP address.

下图展示了使用 Edge 浏览器连接到 Node.js 服务器的示例。 使用 Edge 连接到 NodeJS 服务器

其他网络注意事项

通过远程 IP 地址连接

当使用远程 IP 地址连接到您的应用程序时,它们将被视为来自局域网 (LAN) 的连接。这意味着您需要确保您的应用程序可以接受 LAN 连接。

例如,您可能需要将应用程序绑定到 0.0.0.0 而不是 127.0.0.1。在使用 Flask 的 Python 应用程序示例中,可以使用以下命令完成此操作:app.run(host='0.0.0.0')。进行这些更改时请注意安全性,因为这将允许来自 LAN 的连接。

从局域网 (LAN) 访问 WSL 2 发行版

当使用 WSL 1 发行版时,如果您的计算机设置为可通过 LAN 访问,那么在 WSL 中运行的应用程序也可以通过 LAN 访问。

这不是 WSL 2 中的默认情况。WSL 2 有一个虚拟化以太网适配器,它有自己独特的 IP 地址。目前,要启用此工作流程,您需要执行与常规虚拟机相同的步骤。(我们正在研究改善这种体验的方法。)

下面是一个示例 PowerShell 命令,用于添加一个端口代理,该代理侦听主机上的端口 4000,并将其连接到 IP 地址为 192.168.101.100 的 WSL 2 VM 的端口 4000。

相关内容