WSL2使用Python访问Windows 10上的MongoDB报错:pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description:
1.软件环境⚙️
Windows 10
教育版64位
Python
3.6.3
WSL2
Ubuntu20.04
MongoDB
5.0
pymongo
3.12.0
2.问题描述🔍
WSL2
和WSL1
的重大区别就是WSL2
使用的是虚拟IP
,因此在一些涉及到网络通信的操作时,可能会出现问题。
例如我这边MongoDB
是装在Windows 10
上面,为了数据库的信息能统一,我并没有在WSL2
上面另外装一个MongoDB
,而是想通过程序通过IP
地址直接访问Windows 10
上的MongoDB
。
但是程序在连接到MongoDB
也没有立马拒绝,而是等了很久,最后报超时的错误:
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 63ee5214d131347320a94054, topology_type: Single, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused',)>]>
即:
为了确认问题发生的原因,首先,使用如下代码测试 pymongo
能否连接MongoDB
:
import pymongo
client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
db = client.test_database
collection = db.test_collection
运行上述代码发现没有报错,但是查看变量的时候要等很久很久:
可以看到,运行代码之后,确实连接了(connect=True
),但又没完全连接~~所以在Pycharm
中点击变量的值一直显示Collecting data...
和Getting Variable Value from Python Runtime
,要等很久很久变量才返回,实锤了!这就是我们程序报time out
的原因,那这个问题怎么解决呢?
3.解决方法🐡
其实这个问题的根源就是MongoDB
默认绑定的IP是127.0.0.1
即localhost
,WSL2
本质上是一个虚拟机,在 WSL2
里运行的程序,不能用localhost
来连接到数据库,如果需要访问 本机Windows 10
里的MongoDB
数据库,需要做如下修改:
3.1.查看自己MongoDB
数据库绑定的IP
确保Windows 10
主机上正在运行MongoDB
服务,并且端口号为27017
。可以在Windows 10
命令提示符中运行以下命令来检查:
netstat -an | find "27017"
如果MongoDB
服务正在运行,应该能够看到类似于以下内容的输出:
TCP 0.0.0.0:27017 0.0.0.0:0 LISTENING
如果不是0.0.0.0:27017
,而是像我一样默认的127.0.0.1:27017
:
需要将0.0.0.0:27017
改为127.0.0.1:27017
。
3.2.将Windows 10
主机上运行的MongoDB
实例绑定的IP
地址修改为0.0.0.0
而不是127.0.0.1
-
打开MongoDB
的配置文件。默认情况下,MongoDB
配置文件在Windows 10
主机上的路径为C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg
,其中<version>
是MongoDB
版本号。可以使用文本编辑器打开此文件。
-
找到net
部分。在MongoDB
配置文件中,net
部分定义MongoDB
的网络接口和绑定IP
地址。如果在配置文件中未找到net部分,请添加。
-
将bindIp
参数的值更改为0.0.0.0
(即绑定到所有可用的网络接口)。在net
部分中,找到bindIp
参数的行,然后将其值更改为0.0.0.0
。例如,如果原始行为bindIp: 127.0.0.1
,则更改为bindIp: 0.0.0.0
。确保在bindIp
行下面的缩进级别正确:
-
保存并关闭MongoDB
配置文件。
-
重启MongoDB
服务。在Windows 10
主机上打开命令提示符或PowerShell
,然后运行以下命令以停止MongoDB
服务:
net stop MongoDB
接下来,运行以下命令以启动MongoDB服务:
net start MongoDB
再次查看MongoDB
服务的IP
:
现在,Windows 10
主机上运行的MongoDB
实例应该已绑定到0.0.0.0
地址,而不是127.0.0.1
地址。这将允许WSL2
虚拟机和其他计算机通过网络连接到MongoDB
。
3.3.给WSL2
解除防火墙限制
打开powershell
,输入如下代码:
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
如果没有问题的话,会显示下面的消息:
这个时候会在防火墙为WSL2
新建一条入站规则:
或直接打开入站规则:
3.4.获取Windows 10
的IP
在WSL2
中输入cat /etc/resolv.conf
获取Windows 10
的IP
,如我这边获得的输出是:
(tf2.5) jayce@DESKTOP:~$ cat /etc/resolv.conf
nameserver 172.27.32.1
那么172.27.32.1
就是我们要找的Windows
的IP Address
!因此我们只需要将程序中的127.0.0.1
或localhost
换为172.27.32.1
即可!
4.结果预览🤔
更改完毕后,可以看到我们成功在WSL2
使用Python
访问Windows 10
上的MongoDB
,程序能瞬间拿到连接:
渣男!都看到这里了,还不赶紧点赞
,评论
,收藏
走一波?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)