WSL2使用Python访问Windows 10上的MongoDB报错:pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Er

29 篇文章 10 订阅
13 篇文章 3 订阅

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.问题描述🔍

WSL2WSL1的重大区别就是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.1localhostWSL2 本质上是一个虚拟机,在 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

  1. 打开MongoDB的配置文件。默认情况下,MongoDB配置文件在Windows 10主机上的路径为C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg,其中<version>MongoDB版本号。可以使用文本编辑器打开此文件。

  2. 找到net部分。在MongoDB配置文件中,net部分定义MongoDB的网络接口和绑定IP地址。如果在配置文件中未找到net部分,请添加。

  3. bindIp参数的值更改为0.0.0.0(即绑定到所有可用的网络接口)。在net部分中,找到bindIp参数的行,然后将其值更改为0.0.0.0。例如,如果原始行为bindIp: 127.0.0.1,则更改为bindIp: 0.0.0.0。确保在bindIp行下面的缩进级别正确:
    在这里插入图片描述

  4. 保存并关闭MongoDB配置文件。

  5. 重启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 10IP

WSL2中输入cat /etc/resolv.conf获取Windows 10IP,如我这边获得的输出是:

(tf2.5) jayce@DESKTOP:~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.27.32.1

那么172.27.32.1就是我们要找的WindowsIP Address!因此我们只需要将程序中的127.0.0.1localhost换为172.27.32.1即可!

4.结果预览🤔

更改完毕后,可以看到我们成功在WSL2使用Python访问Windows 10上的MongoDB,程序能瞬间拿到连接:
在这里插入图片描述


渣男!都看到这里了,还不赶紧点赞评论收藏走一波?

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
您提供的链接是关于Windows Subsystem for Linux 2 (WSL 2)内核的文档。WSL 2是一种在Windows 10上运行Linux发行版的功能。要下载WSL 2内核更新包,您可以使用以下链接:\[1\] \[2\] \[3\]。请根据您的计算机架构(x64)选择适用于您的计算机的内核更新包。安装内核更新包后,您还需要下载Linux发行版,以便在WSL 2上运行Linux环境。 #### 引用[.reference_title] - *1* [Windows10安装WSL2](https://blog.csdn.net/shangsongwww/article/details/120217595)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [WSL升级WSl2 以及更新内核组件](https://blog.csdn.net/m0_49648190/article/details/118978891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Windows上快速安装WSL2教程](https://blog.csdn.net/MrYushiwen/article/details/122199276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任博啥时候能毕业?

有用的话,请博主喝杯咖啡吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值