MongoDB的bind_ip必须设为0.0.0.0才能生效。

45
我真的很努力了,甚至重新安装了MongoDB。
而且与MongoDB bind_ip error: bind() failed errno:99 Cannot assign requested address for socket相同。
如果将bind_ip设置为0.0.0.0或127.0.0.1,则可以正常工作。
$ sudo service mongod start
mongod start/running, process 30040
$ sudo service mongod restart
mongod stop/waiting
mongod start/running, process 29704
$ mongo --port 19708
MongoDB shell version: 3.0.3
connecting to: 127.0.0.1:19708/test
>

如果将 bing_ip 设置为:127.0.0.1,192.118.96.10,42.112.36.110,则无法正常工作。

$ sudo service mongod start
mongod start/running, process 29969
$ sudo service mongod restart
stop: Unknown instance:
mongod start/running, process 29766
$ mongo --port 19708
MongoDB shell version: 3.0.3
connecting to: 127.0.0.1:19708/test
2015-06-17T06:32:34.625+0000 W NETWORK  Failed to connect to 127.0.0.1:19708
reason: errno:111 Connection refused
2015-06-17T06:32:34.627+0000 E QUERY
Error: couldn't connect to server   127.0.0.1:19708 (127.0.0.1), connection attempt failed
at connect (src/mongo/shell/mongo.js:181:14)
at (connect):1:6 at src/mongo/shell/mongo.js:181
exception: connect failed

地点:

$ which mongod
/usr/bin/mongod
$ which mongo
/usr/bin/mongo

/etc/mongod.conf中的配置

dbpath=/var/lib/mongodb

logpath=/var/log/mongodb/mongod.log

logappend=true

port = 19708

# ips, eg:
# private ip for mongodb server: 192.118.96.10
# public ip for remote app server: 42.112.36.110

bind_ip = 127.0.0.1,192.118.96.10,42.112.36.110

auth = true

感谢您的支持。

1
我无法让这些绑定选项中的任何一个起作用,无论是空格、无空格、逗号、括号等。 - Tony
在我发布时,以下的解决方案都没有起作用。我不明白为什么它适用于127.0.0.1或0.0.0.0,但如果我将其设置为局域网上第二台机器的IP地址,mongod就无法启动。 - John Forbes
请考虑以下答案 - https://dev59.com/G14b5IYBdhLWcg3wchbs#67605000 - Manuel Jordan
14个回答

45

编辑: 我不确定我的答案是不是错了,或者 bind_ip 的行为是否发生了改变,但是现在可以将其绑定到多个不同的 IP 上。

bind_ip:127.0.0.1,10.0.0.1,8.8.8.8

很可能,mongod 绑定的 IP 地址之一不存在于相关机器上。


mongod 只能绑定到一个 IP 地址,其中 0.0.0.0 是“监听所有可用网络接口”的别名。

因此,请使用以下命令之一:

bind_ip=127.0.0.1

听取环回接口或者

bind_ip=<someIP>

仅收听该IP或者

bind_ip=0.0.0.0

监听系统上 所有 可用的IP地址。

如果需要监听几个特定的IP地址,则很可能您的系统设计存在问题。


4
接受来自0.0.0.0的连接通常是一个错误的想法。 - Dushan Savich
1
@DushanSavich 我敢反对。对于大型集群,动态分配IP地址可能是最佳选择(例如使用DHCP、BootP和Kickstart设置机器),在编写设置时监听0.0.0.0可能会变得合理,因为系统的IP地址在编写设置时无法确定。虽然我同意在监听0.0.0.0时要非常小心,但我不能同意这本质上是一件坏事。 - Markus W Mahlberg
1
我建议设置 bindIpAll: true。当您有一台具有多个网络接口的机器时,使用带有IP地址的 bindIp 是有用的,否则在我看来它没有太多意义。例外情况是 bindIp: localhost,当您想要防止任何外部连接时,通常在维护工作期间使用。 - Wernfried Domscheit
1
如果您想保护MongoDB免受“不良”连接的影响,那么您必须设置防火墙,而不是通过设置bindIp来实现。 - Wernfried Domscheit
@WernfriedDomscheit 这取决于一般的系统设置,但作为经验法则,我同意。 - Markus W Mahlberg
显示剩余4条评论

16

我也曾因愚蠢的错误遇到过同样的问题。

有注释行和空格问题。

我犯了什么错误

# network interfaces
net:
  port: 27017
 #bindIp: 127.0.0.1
bindIp: privateIp

而不是

net:
  port: 27017
  bindIp: 10.1.2.4

绑定到多个IP地址

bindIp: [127.0.0.1,10.128.0.2]

希望这个答案对某人有所帮助。


我在Ubuntu 14.04 LTS上部署了MongoDB。bindIp:[127.0.0.1,10.128.0.2] 对我很有效。谢谢! - Bruce Yo

7

Mongo 3.6.2 Community

对我来说解决方案是编辑/etc/mongod.conf 的部分内容。

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.240   # No brackets, No spaces, only comma separated

#security

然后保存并执行以下操作以重新启动和验证服务:
> service mongod restart
> service mongod status

无故障,现在验证是否有人在监听:

> netstat -a |grep :27017

tcp   0   0  yourhostname:27017   0.0.0.0:*     LISTEN
tcp   0   0  localhost:27017      0.0.0.0:*     LISTEN

现在可以使用您最喜爱的Mongo工具或命令行进行连接。

/etc/mongod.conf中不同格式化的一些结果:

  • 逗号和空格只会绑定第一个IP地址。
  • 只有空格分隔符也只会绑定第一个IP地址。
  • [ ] 包围会导致mongod启动失败。

1
我将0.0.0.0添加到了bindIP,但仍然无法远程连接。我不确定原因是什么。 - BaiMaoli

5
我花了几个小时来解决这个问题,最终查看日志并搜索我发现的内容帮助我找到了答案(当我搜索'mongo bindIp multipl'时得到的所有结果都是一些没用的答案)。首先,在我的/etc/mongod.conf文件中生效的代码块如下:
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,172.16.1.2

没有空格,没有引号,没有括号...但即使是正确的,重新启动mongodb也会出错,然后它就拒绝启动。我花了数小时尝试其他各种不正确的配置(这很令人沮丧,因为这行代码的正确性实际上并没有解决问题,而我不知道还有另一个问题)。我通过删除mongodb套接字文件来解决它:
rm /etc/mongodb-27017.sock 

在这之后,运行
systemctl restart mongod

工作没有出现错误。有趣的事情(让我感到非常沮丧的部分)是,在试错过程中,如果我将bindIP设置回只有127.0.0.1并重新启动mongod,它就可以正常工作,这让我认为那行代码是正确的,问题出在我尝试的其他条目/语法上。(我最好的猜测是,套接字文件中的某些内容引用了ip?我对编码的这个元素不熟悉。)

删除套接字后,我就可以像这样进入mongo shell(启用身份验证时需要选项):

mongo -u admin -p password --authenticationDatabase "admin")

这意味着 127.0.0.1 可以工作,并且我可以从远程应用程序连接(在我的当前情况下,我正在设置的 nodebb 测试实例)。


1
有一个类似的问题,但是系统上现在没有/etc/mongodb-27017.sock文件。 - Jeremias Binder

5
在我的情况下,上述选项均未奏效。最终适用于我的规范是:
bind_ip= [<IP_one> <IP_two>]


一个例子可能是:
bind_ip= [127.0.0.1 10.0.0.4]

请注意,在两个方向之间没有逗号。

我在Ubuntu 16.4.5(LTS)上安装了MongoDB 2.6.10。


这在Ubuntu 18.04上的mongodb 3.6.3上仍然有效,使用传统的mongodb.conf格式。 - frmbelz

2

文档中说

"您可以将逗号分隔的列表连接起来,将mongod绑定到多个IP地址。"

但是,这并不正确...


1

我曾经在AWS EC2 Ubuntu 20上遇到了同样的问题。这个问题被解决了,方法是用私有IPv4地址代替公共IPv4地址


0
我困惑的是,我以为需要列出其他可以访问数据库的机器的IP地址。但实际上不是这样的。你只需要列出运行mongoDB的服务器的IP地址即可。对我来说,从以下更改:
bindIp: localhost

至:

bindIp: localhost,127.0.0.1,<actual IP of my server>

然后我就可以从网络中的其他机器访问MongoDB了。我只是没有想到这个问题的正确解决方法。我在这里发布这篇文章,以防其他人和我一样犯同样的错误。


0

适用于Ubuntu 18和Mongo --version 4.x.xx:

1 - 在etc/mongod.conf中添加以下内容

bindIp: "127.0.0.1,0.0.0.0"

2 - 然后使用pm2:

sudo apt-get update sudo apt-get pm2

3 - 启动pm2服务到mongod

pm2 start mongod

注意:在生产环境中需要删除0.0.0.0


0

嘿,我正在使用MongoDB shell版本:3.2.6。

bindIP = 127.0.0.1,192.168.0.50 
bindIP = [127.0.0.1,192.168.0.50]
bind_ip = 192.168.6.38 

不起作用,我使用以下命令编辑了mongod.conf文件

sudo -i gedit /etc/mongod.conf file 

将 bind_ip = 0.0.0.0 更改为 bind_ip = 192.168.6.38 后,它正常工作了....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接