从服务器B访问服务器A上的MongoDB遇ServerSelectionTimeoutError求助
解决服务器B连接SSH服务器A上MongoDB超时问题
以下是针对pymongo.errors.ServerSelectionTimeoutError超时错误的排查和解决步骤:
1. 验证网络连通性
在服务器B上执行命令,测试能否访问服务器A的27017端口:
nc -zv **.***.**.96 27017 # 或使用telnet telnet **.***.**.96 27017
若命令返回无法连接,说明网络层面存在阻断,优先处理网络问题。
2. 调整MongoDB绑定配置
登录服务器A,修改MongoDB配置文件(通常路径为/etc/mongod.conf):
- 找到
net段下的bindIp,默认值127.0.0.1仅允许本地访问,修改为0.0.0.0(允许所有IP访问)或服务器A的公网IP:
net: port: 27017 bindIp: 0.0.0.0
- 重启MongoDB服务使配置生效:
systemctl restart mongod
3. 开放服务器A防火墙端口
确保服务器A的防火墙允许27017端口的TCP入站请求:
- 若使用ufw:
ufw allow 27017/tcp ufw reload
- 若使用firewalld:
firewall-cmd --add-port=27017/tcp --permanent firewall-cmd --reload
- 若使用iptables:
iptables -A INPUT -p tcp --dport 27017 -j ACCEPT service iptables save
4. 通过SSH端口转发安全连接(无需修改MongoDB绑定)
若出于安全考虑不想修改MongoDB绑定IP,可通过SSH隧道将服务器A的MongoDB端口映射到服务器B本地:
- 在服务器B上执行SSH端口转发命令(保持终端会话打开):
ssh -L 27017:localhost:27017 你的SSH用户名@**.***.**.96
- 修改Python代码中的
host为localhost,其余参数不变:
import pymongo import urllib.parse usernamee = "username" passwords = "password" username = urllib.parse.quote_plus(usernamee) password = urllib.parse.quote_plus(passwords) host = "localhost" # 改为本地 port = 27017 database_name = "dbName" collection_name = "dbCollection" uri = f"mongodb://{username}:{password}@{host}:{port}/{database_name}" client = pymongo.MongoClient(uri) db = client[database_name] collection = db[collection_name] print("Collection content:") for document in collection.find(): print(document)
5. 检查MongoDB用户权限
登录服务器A的MongoShell,验证目标用户是否具备远程访问权限:
use admin // 查看用户信息 db.getUser("username")
若用户存在authenticationRestrictions的IP限制,需移除或添加服务器B的IP:
db.updateUser("username", { authenticationRestrictions: [] })
内容的提问来源于stack exchange,提问作者user22268432
相关产品推荐
相关产品推荐

