如何使用多个IP地址设置mongod.conf的bind_ip?

56
我是一个新手,不太懂如何设置服务器环境和mongoDB。这听起来很简单,但我真的需要你的帮助。
我正在尝试从本地计算机连接到运行mongodb实例的虚拟机,我认为这应该类似于在单独的远程服务器上运行时的生产环境。
环境如下:
- 虚拟机的私有IP: 192.168.184.155 - 本地计算机和虚拟机的公共IP:96.88.169.145
我更改了/etc/mongod.conf文件中的bind_ip
bind_ip = 127.0.0.1

to

bind_ip = 127.0.0.1,192.168.184.155,96.88.169.145

在我重新启动mongod服务后,无论是虚拟机还是本地机器都无法通过mongodb命令访问mongodb,并给出以下错误。

MongoDB shell version: 3.0.1
connecting to: test
2015-03-17T16:02:22.705-0400 W NETWORK  Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2015-03-17T16:02:22.707-0400 E QUERY    Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

然而,如果我改变

bind_ip = 192.168.184.155

重新启动服务后,我可以从本地机器上使用mongo进行访问。但是在多个IP地址上似乎无法正常工作。我尝试在mongodb文档中查找信息,但它们提到的bind_ip参数需要使用逗号分隔的列表,这让我很困惑。

非常感谢您的帮助。


1
如果您使用bind_ip = 127.0.0.1,192.168.184.155会怎样?对我来说,96.88.169.145不是您的VM上有效的IP。 - anhlc
1
@anhlc 这是相同的结果。一旦我添加了多个IP地址,它们都无法工作。有什么想法吗? - yeelan
1
你能否从日志中获取启动 mongod 时解析的命令行选项?它真的应该可以工作,所以我想知道是否有一些奇怪的 VM 网络障碍? - wdberkeley
嗨@wdberkeley,非常感谢您提出这个问题!我检查了日志文件,并找到了问题所在!似乎我不小心在下一个IP地址之前加了一个空格,导致整个程序崩溃。 - yeelan
我建议设置 bindIpAll: true。当您有一台具有多个网络接口的机器时,使用带有IP地址的 bindIp 是有用的,否则在我看来它没有太多意义。例外情况是 bindIp: localhost,当您想要防止任何外部连接时,通常在维护工作期间使用。 - Wernfried Domscheit
显示剩余2条评论
20个回答

62

在Mongo 3.2.7中,将逗号分隔的IP地址用括号包起来对我有效:

bindIp = [127.0.0.1, 192.168.184.155, 96.88.169.145]

3
不知道为什么这篇文章被踩了,但这似乎成为了现在的常态。 - Bazinga777
2
不再需要在逗号后面加括号或空格。bindIp应该改为bind_ip。这是针对Ubuntu的,其他系统可能会有所不同... - Andrew
2
joe-cheng和@puneet-goyal的解决方案都可行。如果有空格,则需要括号,如果没有空格,则只需使用逗号分隔列表即可。 - Gnana
在我的情况下,这里的3.6无法工作。它将括号添加为IP的一部分。 - Gonzalo Aguilar Delgado
我正在使用最新版本。上述解决方案对我无效。 - Amaranadh Meda
显示剩余3条评论

25

使用以下版本的MongoDB: MongoDB shell version v3.6.10

问题复现: 当使用[127.0.0.1,xxx.xxx.xxx.xxx]时,我们会收到以下错误消息。 标量选项'net.bindIP'必须是单个值 尝试'mongod --help'获取更多信息

分析 这是因为,根据MongoDB文档:https://docs.mongodb.com/manual/reference/configuration-options/#net.bindIP

net.bindIP的类型为"string"。

绑定多个IP地址的解决方案

bindIp: "127.0.0.1,xxx.xxx.xxx.xxx"

注意:逗号后不要加空格


它适用于Mongo 4.4.8版本。 - adobean
1
不适用于Mongo 6.0。 - strix25
仍然适用于Mongo 6.0。 - Hoàng Nguyễn

17

您可以通过以下方式实现:

bindIp: [172.31.60.184,127.0.0.1]

记得在逗号后不要加空格。


你使用的MongoDb版本是什么?我正在尝试使用2.6版本,但似乎不起作用(逗号分隔列表,没有空格),括号版本也不行。 - Pat M
这在 db version v3.2.12 git version: ef3e1bc78e997f0d9f22f45aeb1d8e3b6ac14a14 Ubuntu 16.04 上不起作用。使用下面答案中的括号可以解决问题。 - JohnAllen
由于某种原因,'[172.31.60.184,127.0.0.1]' 在版本3.6.8中无法使用。对我有效的方法是修改 /etc/mongodb.conf 并插入以下内容: binding_ip = 172.31.60.184,localhost 这将绑定到第一个指定的IP和本地主机。 - DRProgrammer

7
在我的情况下,使用mongoDB 4.4.6,以下解决方法有效 -
net:
  port: 27017
  bindIp: 127.0.0.1;<private_host_ip>

在进行更改后,请使用以下命令重新启动MongoDB -

sudo systemctl restart mongod

检查MongoDB状态,请运行 -

sudo systemctl status mongod

这个配置是可以工作的,但我无法运行mongo shell,它会抛出错误 connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused : connect@src/mongo/shell/mongo.js:372:17 - Kartik Garasia
@KartikGarasia - 请发送详细的错误日志,或者您的Mongo配置文件的截图。 - Sachin Vairagi
这适用于MongoDB shell版本v4.0.28。 - Cesar Jr Rodriguez
似乎无法与MongoDB shell版本v4.4.9一起使用。 - mikeym

6

默认的 /etc/mongod.conf 文件中有这个网络接口的条目:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

这对应于命令行参数--bind-ip arg,注意破折号符号已转换为驼峰式大小写。为了将运行在虚拟机中的数据库暴露给主机,在测试目的下最简单的方法是将数据库绑定到所有接口。这将涵盖虚拟机使用NAT接口或桥接接口的情况。命令行参数是--bind_ip_all,它没有参数,其存在对应于配置文件中的bindIPAll: true参数。因此,配置文件应更改为:

# network interfaces
net:
  port: 27017
  bindIpAll: true

注意,bindIp 参数已被移除。

需要注意的是,可以在命令行中添加参数来覆盖配置文件中的参数。通常情况下,mongod 是使用 --config /etc/mongod.conf 参数运行的。更改配置文件比查找运行它作为守护程序的脚本并让 systemd 重新加载和使用它要容易得多。

关于配置文件的 YAML 特性与命令行参数,请参阅文档,目前位于 https://docs.mongodb.com/manual/reference/configuration-options/

如果您在使用 NAT 的虚拟机上运行 mongod,则默认端口 27017 不会暴露给主机。需要将主机上的端口映射到客户 VM 中的此端口。这超出了本回答的范围,但是一些研究将为您的 VM 软件(VirtualBox、VMware 等)提供一个方法。


4

MongoDB 6.0.1

bindIp: 127.0.0.1;192.168.1.0

更改后只需重新启动mongodb服务器:

sudo systemctl restart mongod

在我的6.0.0版本中无法工作。 - Dylee
根据文档:“输入逗号分隔的值列表”。因此请替换分号。(@Dylee 试试这种方式) - Yılmaz Durmaz

3

感谢@wdberkeley和@anhlc提供的线索。

我查看了位于/var/log/mongodb/mongod.log下的日志文件。它显示了问题的失败原因。

2015-03-17T16:08:17.274-0400 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1, 192.168.184.155" }, storage: { dbPath: "/var/lib/mongodb" }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
2015-03-17T16:08:17.332-0400 I NETWORK  [initandlisten] getaddrinfo(" 192.168.184.155") failed: Name or service not known

所以mongo.conf文件对空格比较敏感,我不小心添加了空格,本该注意到的。就像@anhlc指出的那样,96.88.169.145不是VM的有效IP地址。这也导致了错误的发生。非常感谢你们两位的帮助!希望这可以帮助那些遇到同样问题的人。

7
你的意思是我们应该写成这样:bind_ip=127.0.0.1 192.168.184.155 96.88.169.145,用空格分隔而不是逗号分隔? - Shashank Agrawal

3
在我这种情况下,解决方案是将逗号分隔的IP放在一起,不要有任何空格。
bind_ip=192.168.2.29,127.0.0.1
#port = 27017

那样做的方法是有效的:
2018-10-02T07:49:27.952+0000 I CONTROL  [initandlisten] options: { config: "/etc/mongodb.conf", net: { bindIp: "192.168.2.29,127.0.0.1", unixDomainSocket: { pathPrefix: "/run/mongodb" } }, storage: { dbPath: "/var/lib/mongodb", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongodb.log" } } 2018-10-02T07:49:27.954+0000 I -    [initandlisten] Detected data files in /var/lib/mongodb created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.

这里是Mongo 3.6.3。

命令mongod --version的返回结果如下: 数据库版本:v3.6.3 Git版本:9586e557d54ef70f9ca4b43c26892cd55257e1a5 OpenSSL版本:OpenSSL 1.1.0g 2 Nov 2017 内存分配方式:tcmalloc 模块:无 构建环境: 系统架构:x86_64 目标架构:x86_64


3

我使用逗号、无空格和完全限定域名(FQDN),成功在我的版本 3.2 服务上添加了第二个 IP。

net:
  port: 27017
  bindIp: localhost,dev-2.office.sampleorg.com

3

我在SUSE 12.x上运行3.6版本,使用逗号分隔的IP列表时出现了问题。我通过设置bindIp: 0.0.0.0来修复了这个问题。


谢谢,我也遇到了同样的问题,以上和以下的解决方案都不起作用,但是你的解决方案+1。 - Nasiruddin Saiyed
4
0.0.0.0可以使用,因为它没有绑定到任何服务器,这基本上将其绑定到了您的公共IP地址,可能会将您的数据库暴露给公众。虽然可以使用,但是不是一个好主意。 - L. Norman
不是这样的。0.0.0.0是一个不可路由的元地址。在服务器上下文中,0.0.0.0表示“本地机器上的所有IPv4地址”。 - jprism
1
我仍然认为这有点不太正规。它基本上允许任何获得本地服务器访问权限的IP地址。对于3.6版本,最安全的方法是 bindIp: 127.0.0.1, xxx.xxx.xxx.xxx 并在其下方设置 bindIpAll: true <-- 默认值为false。 - L. Norman
哇...不要这样做!这会允许任何IP地址访问您的数据库。 - M_R_K
显示剩余2条评论

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