You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从服务器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本地:

  1. 在服务器B上执行SSH端口转发命令(保持终端会话打开):
ssh -L 27017:localhost:27017 你的SSH用户名@**.***.**.96
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:26:01