在服务器上连接MongoDB数据库,核心路径只有两条:通过mongosh命令行工具直接连接,或通过各语言驱动中的连接字符串(URI)接入,而打通这一步的关键在于正确配置bindIp、开启鉴权并放行防火墙端口。
很多人在本机连MongoDB用得顺手,一到服务器上就卡壳,这通常不是数据库本身出了问题,而是服务器环境与默认配置之间的冲突,下面直接按操作顺序,把服务器连接MongoDB的完整链路拆开讲清楚。
连接前的准备:先看清服务器和MongoDB的状态
动手连接之前,花两分钟确认三件事,能省掉后面八成报错排查的功夫,行业共识认为,百分之九十以上的连接失败源于环境前提未满足,而非数据库故障。
- 确认MongoDB进程在运行:在服务器终端执行
systemctl status mongod(CentOS/RHEL系)或service mongod status(Ubuntu系),如果没启动,先执行systemctl start mongod。 - 确认服务器端口对外开放:MongoDB默认监听27017端口,执行
ss -lntp | grep 27017查看监听状态,如果输出为空,说明服务没起来或端口被改过。 - 确认服务器防火墙规则:检查firewalld或iptables是否放行了27017端口,酷番云、简米云这类云服务器还需要在安全组里单独配置入站规则。
三项都满足后,再谈具体的连接方式才不空转。
本机连接:用mongosh验证基础连通性
刚装好MongoDB或排错时,我习惯先在服务器本机上试一次连接,把数据库自身的问题和网络层面的问题分开。
本机无鉴权环境的连接
如果MongoDB刚装好、还没配置账号密码,直接在服务器上执行:
mongosh
进入shell后看到test>提示符即代表连接成功,这种连接方式走的是本地回环地址,不受远程访问限制。
本机鉴权环境的连接
生产环境基本都开了鉴权,这时连接命令要带上用户名和密码:
mongosh mongodb://admin:密码@127.0.0.1:27017/admin
其中admin是管理员账号,密码换成实际密码,最后的admin表示认证数据库,如果这里用了错误的认证数据库,登录时会返回Authentication failed。
常见坑:mongosh命令不存在
部分发行版把客户端工具和服务器分开了,如果提示mongosh: command not found,需要单独安装:
apt install mongodb-mongosh
或
yum install mongodb-mongosh
装好之后重复上面命令即可。
mongodb远程连接不上:三步定位瓶颈
mongodb远程连接不上是服务器场景中出现频率最高的问题,根本原因不外乎三个方面:端口没开放、bindIp限制、鉴权账号不对,按下面的顺序逐一验证,比胡乱改配置高效得多。
第一步:确认bindIp配置
MongoDB默认只监听127.0.0.1,这意味着任何外部机器发来的连接都会被拒绝,打开MongoDB配置文件,常见路径为/etc/mongod.conf,找到net块:
net: port: 27017 bindIp: 127.0.0.1
如果bindIp只写了127.0.0.1,远程连接肯定失败,修改为:
bindIp: 0.0.0.0
或者指定具体内网IP,比如bindIp: 127.0.0.1, 192.168.1.100,修改后执行systemctl restart mongod。
第二步:检查服务器防火墙
使用firewalld的系统执行:
firewall-cmd --permanent --add-port=27017/tcp firewall-cmd --reload
使用iptables的系统执行:
iptables -A INPUT -p tcp --dport 27017 -j ACCEPT service iptables save
如果服务器是云主机,还需要到云控制台的安全组规则中放行TCP 27017端口,简米云、酷番云和华为云的操作路径略有差异,但本质都是添加入方向规则。
第三步:创建远程访问专用账号
生产环境中不建议直接使用root账号远程连接,创建一个权限受限的账号更合理:
db.createUser({
user: "appUser",
pwd: "强密码",
roles: [{ role: "readWrite", db: "mydb" }]
})
创建之后用以下命令验证远程连接:
mongosh "mongodb://appUser:强密码@服务器公网IP:27017/mydb"
连接字符串配置:各场景下的URI写法
连接字符串(URI)是连接MongoDB的统一入口,各语言驱动和图形化工具(如Compass)都支持这种方式,搞清楚URI的结构,比死记命令更实用。
URI的标准结构
mongodb://用户名:密码@主机地址:端口/数据库?选项参数
各字段含义如下:
- mongodb://:协议头,固定写法,新版驱动也支持
mongodb+srv://,用于DNS种子列表模式。 - 用户名:密码:认证凭据,密码中有特殊字符时需URL编码,比如要写成
%40。 - 主机地址:端口:服务器IP和MongoDB监听端口,默认27017。
- 数据库:认证数据库名称,注意是认证库而非常用业务库。
- 选项参数:常见的如
?authSource=admin指定认证源,?replicaSet=rs0用于副本集。
单机节点连接串
一个最简单的生产环境连接串:
mongodb://admin:密码@123.45.67.89:27017/?authSource=admin
这是mysql迁移到mongodb场景中最常用的写法。authSource=admin告诉驱动去admin库校验账号身份。
副本集连接串
如果服务器部署了副本集,连接串要列出所有节点:
mongodb://admin:密码@192.168.1.1:27017,192.168.1.2:27017,192.168.1.3:27017/?replicaSet=rs0
驱动会自动探测主节点并转发写入请求,需要注意的是,即使某个节点挂了,只要副本集内还有多数派存活,连接就不会中断。
分片集群连接串
连接mongos路由器而不是直接连shard,格式与副本集类似,但端口默认使用27017或自定义端口:
mongodb://admin:密码@mongos1:27017,mongos2:27017,mongos3:27017/?authSource=admin
服务器连接mongodb报错的典型场景与解法
排查报错是服务器维护的日常功课,以下几类报错覆盖了绝大多数实际场景,把错误信息和对应解法对照着看,能快速定位问题所在。
| 报错信息 | 涉及原因 | 解决入口 |
|---|---|---|
connect ECONNREFUSED |
端口未开放或MongoDB没在运行 | 检查mongod进程状态 |
Authentication failed |
账号错误或authSource指定有误 | 核对用户名、密码和认证库 |
Connection timed out |
防火墙/安全组拦截或公网IP不通 | 检查云控制台安全组 |
Cannot connect |
bindIp配置限制了访问来源 | 修改/etc/mongod.conf |
HostUnreachable |
IP地址填写错误或网段不互通 | ping服务器IP确认连通性 |
案例:ECS服务器上一直报连接超时
一个典型场景是服务器本机能连,本地电脑连不上,先在服务器上执行ping测试本机连通性,再在本地执行telnet 服务器IP 27017,如果telnet超时但ping正常,问题几乎必然出在云安全组,简米云ECS需要在控制台找到实例,进入安全组配置页,添加一条TCP 27017的入方向授权规则,来源填0.0.0/0或你本地的固定IP。
turn on profiling场景下的连接异常
调优过程中打开性能分析(profiling)有时会导致连接数暴增,尤其是配置了db.setProfilingLevel(2)全量采集时,连接字符串中增加maxPoolSize=50可以限制连接池上限,避免打爆MongoDB的最大连接数。
从安全视角配置服务器与MongoDB的联动
连接通了不等于配置合理,服务器环境暴露公网后,MongoDB的默认配置满足不了基本的安全需求,以下措施是生产环境必须具备的底线。
启用认证机制
在/etc/mongod.conf中找到security块,确保以下配置存在:
security: authorization: enabled
如需强制TLS加密传输,添加:
net:
tls:
mode: requireTLS
禁用公网直接暴露
将bindIp从0.0.0改为内网IP或特定网段,是比依赖防火墙更稳妥的做法,内网请求通过跳板机转发,公网完全不可达,这样即使MongoDB出现未知漏洞,暴露面也远远低于直接绑公网。
使用受限账号替代全权限账号
不同业务线使用不同的账号,权限按库最小化分配,比开一个root给所有人用可控得多,据统计,大多数业务故障中数据库被黑的事故,都与root账号明文密码四处流传有关。
mongodb连接串参数调优:连接池和超时时间
连接字符串中的参数不写也能跑,但线上的稳定性和响应速度受这些参数影响很大,按业务规模做对应调整是必要的。
关键参数速查
- maxPoolSize:连接池上限,默认100,高并发业务建议调整为200-300。
- minPoolSize:最小空闲连接数,默认0,对延迟敏感的业务可设为5-10。
- connectTimeoutMS:建连超时,默认10000毫秒,跨地域访问建议调大到20000。
- serverSelectionTimeoutMS:服务器选择超时,默认30000毫秒,副本集环境中调低到10000可以更快触发故障转移。
- socketTimeoutMS:读写超时,默认0表示永不超时,生产环境建议设置明确值,比如60000。
以Java驱动为例,一个带参数的连接串:
mongodb://user:密码@123.45.67.89:27017/admin?maxPoolSize=200&connectTimeoutMS=20000
Python驱动(pymongo)中参数写法类似:
client = MongoClient("mongodb://user:密码@123.45.67.89:27017/admin", maxPoolSize=200, connectTimeoutMS=20000)
服务器连接mongodb的图形化工具实操
命令行之外,很多运维和开发同学习惯用图形化工具查看数据,MongoDB Compass是官方出品的GUI客户端,支持连接串直接填入,也支持SSH隧道方式接入。
Compass连接方式
打开Compass后,在连接界面粘贴URI即可,如果服务器仅开放内网端口,可以先在本机建立SSH隧道再连Compass:
ssh -L 27017:127.0.0.1:27017 用户名@服务器IP
然后Compass连接localhost:27017即可,这种方式适合服务器MongoDB只监听内网地址、堡垒机才能访问的场景。
Q&A:服务器连接mongodb常见问题速答
Q:服务器连接mongodb报错Authentication failed怎么解决?
A:优先排查认证数据库是否匹配,连接串中/admin表示去admin库校验身份,如果账号是在业务库下创建的,需要将认证库改为业务库名或通过authSource参数指定,其次确认密码是否包含特殊字符,必要时做URL编码。
Q:mongodb远程连接不上,但本机可以连接,问题出在哪里?
A:按以下顺序检查:确认bindIp包含0.0.0或实际网卡IP,确认服务器防火墙放行27017端口,确认云安全组入方向规则同步放行,三步检查完,绝大多数情况都能定位到问题所在。
Q:内网服务器连接MongoDB数据库使用什么端口?
A:MongoDB默认业务端口为27017,通过SSH隧道连接时,本地转发端口可以随意指定,比如27018,只要与远程实际监听端口对应即可,副本集节点之间的内部通信额外使用复制集端口,但客户端连接不受影响。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/795135.html


