CentOS 上 MongoDB 连接问题的排查与修复
一 快速自检清单
- 确认服务已启动并开机自启:执行sudo systemctl status mongod,若未运行则执行sudo systemctl start mongod与sudo systemctl enable mongod。
- 检查监听与端口:查看**/etc/mongod.conf中的net.bindIp**(建议测试阶段设为0.0.0.0以监听所有地址)与net.port(默认27017),必要时用sudo systemctl restart mongod使配置生效。
- 本机连通性测试:执行ss -lntp | grep 27017或netstat -tulpen | grep 27017确认进程在监听;远程连通性用telnet 服务器IP 27017或nc -vz 服务器IP 27017。
- 防火墙放行:CentOS 7 使用firewall-cmd --query-port=27017/tcp查询,未放行则执行firewall-cmd --permanent --add-port=27017/tcp与firewall-cmd --reload;如使用云服务器,还需在安全组放行27017/tcp。
- 日志定位:查看**/var/log/mongodb/mongod.log与journalctl -xe | grep mongod**,优先从报错信息入手。
二 常见错误与对应修复
- 报错“Connection refused”:多由服务未启动、bindIp=127.0.0.1仅本地监听、或防火墙/安全组未放行27017导致。修复:启动服务;将bindIp改为0.0.0.0或包含客户端网段;放行防火墙/安全组端口。
- 远程可连本机不行:通常是本机回环限制或服务仅绑定127.0.0.1。修复:调整bindIp并重启服务。
- 客户端报“No suitable servers found”(如 Navicat):常见于启用了SSL却未正确配置,或驱动/URI参数不匹配。修复:在客户端关闭 SSL 或正确配置证书;核对驱动版本与连接串参数。
- 认证失败:启用security.authorization: enabled后,连接串需提供用户名/密码与认证库,例如:mongodb://user:pass@host:27017/dbname?authSource=admin。
- SELinux 拦截:执行sestatus查看状态,排查期间可临时setenforce 0验证,再按策略放行或恢复 enforcing。
三 配置文件与关键参数示例
- 编辑**/etc/mongod.conf**:
- 网络:
- net.bindIp: 0.0.0.0(测试阶段;生产建议绑定内网网段或白名单)
- net.port: 27017
- 安全:
- security.authorization: enabled(启用后需带账号密码连接)
- 使配置生效:sudo systemctl restart mongod
- 连接串示例:
- 无认证:mongodb://服务器IP:27017
- 有认证:mongodb://用户名:密码@服务器IP:27017/数据库名?authSource=admin
说明:bindIp 控制监听地址;authorization 控制是否需要认证;URI 中的authSource指明存放用户凭据的数据库(常见为admin)。
四 Docker 场景的专项排查
- 进入容器修改配置:例如docker exec -it mongodb-server /bin/bash,编辑**/etc/mongod.conf或/etc/mongod.conf.orig**,将bindIp改为0.0.0.0或注释掉仅本地监听的行。
- 容器网络与端口:运行容器时映射端口,例如docker run -d --name mongodb-server -p 27017:27017 mongo:4.4(示例镜像与标签可按需调整)。
- 防火墙与连通性:宿主机执行firewall-cmd --permanent --add-port=27017/tcp && firewall-cmd --reload,再用telnet/nc测试服务器IP 27017。
- 客户端设置:若使用图形工具(如 Navicat),确认未误启用SSL或按实际证书正确配置。
五 仍未解决时的定位建议
- 查看服务与系统日志:tail -f /var/log/mongodb/mongod.log与journalctl -xe | grep mongod,从最近的错误行定位根因。
- 资源与依赖:用top/htop检查CPU/内存/磁盘;必要时安装缺失依赖(如openssl-devel)。
- 端口占用与残留套接字:若日志提示Address already in use或Failed to unlink socket file /tmp/mongodb-27017.sock,结束占用进程并删除残留套接字后再启动。
- 最小化验证:临时将bindIp设为0.0.0.0、关闭防火墙/安全组规则进行排除法验证,确认无误后再收紧到白名单。