Node.js连接MongoDB socket遇权限拒绝的解决方案咨询
解决Node.js无法写入MongoDB Unix Socket的权限问题
这是Unix系统下使用MongoDB socket连接时很常见的权限场景,不用纠结于直接修改临时socket文件(毕竟mongod重启就会重置权限),这里有两种安全且常规的解决思路,优先推荐第一种:
方法1:将Node.js运行用户加入mongodb用户组
这是最符合权限安全规范的做法,不需要改动MongoDB的任何配置:
- 执行命令把用户
X追加到mongodb用户组:
(sudo usermod -aG mongodb X-aG参数是追加组,不会覆盖用户原有的组权限) - 让用户
X重新登录系统(或者临时执行newgrp mongodb切换当前会话的组权限),确保新的组权限生效 - 验证:用户
X执行groups命令,输出里应该包含mongodb组
完成后,用户X就拥有了访问mongodb socket文件的权限,Node.js应用无需改动任何代码或运行身份,就能正常连接。
方法2:修改MongoDB配置,指定Socket的权限/所属组
如果不想调整用户组,也可以直接让mongod启动时创建带有指定权限的socket文件:
- 找到MongoDB的配置文件,通过systemd运行的话通常是
/etc/mongod.conf - 编辑配置文件,找到
net模块,添加或修改unixDomainSocket的配置项:net: port: 27017 bindIp: 127.0.0.1 unixDomainSocket: path: /tmp/mongodb-27017.sock filePermissions: 0770 # 所有者和所属组拥有读写执行权限 group: mongodb # 指定socket的所属组为mongodb - 保存配置后重启mongod服务:
sudo systemctl restart mongod.service - 此时查看socket文件权限会变成
srwxrwx--- 1 mongodb mongodb,只要用户X属于mongodb组(不建议用0777这种完全开放的权限,会带来安全风险),就能正常访问。
为什么直接修改socket权限没用?
因为mongod每次启动时,会根据配置重新创建socket文件,完全覆盖原文件的权限属性,所以手动修改的权限会被立刻重置,必须从MongoDB的配置层面来定义socket的权限规则。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

