如何使用多个ip地址设置mongod.conf bind_ip

yee*_*lan 41 remote-access virtual-machine mongodb

我是设置服务器环境和mongoDB的新手.这可能听起来很简单,但是,我真的需要你的帮助.

我正在尝试连接到我的虚拟机,该虚拟机从本地机器运行mongodb实例,我相信当我在一个单独的远程服务器上运行时,它应该类似于生产环境.

环境如下:

  • 虚拟机的专用IP:192.168.184.155

  • 本地计算机和虚拟机的公共IP:96.88.169.145


我改变了bind_ip/etc/mongod.conf文件

bind_ip = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

bind_ip = 127.0.0.1,192.168.184.155,96.88.169.145
Run Code Online (Sandbox Code Playgroud)

重新启动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
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变了

bind_ip = 192.168.184.155
Run Code Online (Sandbox Code Playgroud)

并重新启动服务,它工作,我可以使用本地计算机上的mongo访问.它似乎不适用于多个IP地址.我试着在mongodb文档中查找,但是,他们确实提到bind_ip采用逗号分隔的列表,这让我很困惑.

感谢您的帮助.

Joe*_*eng 53

用逗号分隔的带有括号的Ips包含在mongo 3.2.7中,对我来说:

bindIp = [127.0.0.1, 192.168.184.155, 96.88.169.145]
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这个被低估了,但现在这似乎是常态 (2认同)
  • 逗号后面不应该有括号或空格.它也是bind_ip而不是bindIp.这对于ubuntu可能与其他系统不同...... (2认同)
  • 我用过:代替=而且它有效. (2认同)
  • joe-cheng和@ puneet-goyal的解决方案均有效。带空格的括号是必需的,如果没有空格,则只能使用逗号分隔的列表。 (2认同)

pun*_*yal 20

你可以这样做:

bindIp: [172.31.60.184,127.0.0.1]
Run Code Online (Sandbox Code Playgroud)

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


foc*_*ess 7

默认的 /etc/mongod.conf 文件包含以下网络接口条目:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

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

# network interfaces
net:
  port: 27017
  bindIpAll: true
Run Code Online (Sandbox Code Playgroud)

请注意,该bindIp参数已被删除。

还应该注意的是,可以将参数添加到命令行来覆盖配置文件中的参数。通常,mongod 是使用该--config /etc/mongod.conf参数运行的。更改配置文件更容易,而不是寻找将其作为守护进程运行的脚本并重新systemd加载和使用它。

有关配置文件的 YAML 性与命令行参数的详细信息,请参阅当前文档:https://docs.mongodb.com/manual/reference/configuration-options/

如果您在使用 NAT 的虚拟机上运行 mongod,默认端口27017将不会暴露给主机。需要将主机上的端口映射到来宾虚拟机中的该端口。这超出了本答案的范围,但一些研究将提供一种用于您正在使用的虚拟机软件(VirtualBox、VMware 等)的方法


Zee*_*oft 7

就我而言,使用 mongoDB 4.4.6,以下解决方案有效 -

net:
  port: 27017
  bindIp: 127.0.0.1;<private_host_ip>
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl restart mongod
Run Code Online (Sandbox Code Playgroud)

要检查 mongoDB 状态,请运行 -

sudo systemctl status mongod
Run Code Online (Sandbox Code Playgroud)


小智 6

使用以下版本的MongoDB:MongoDB Shell版本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的类型为“ 字符串 ”。

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

bindIp: "127.0.0.1,xxx.xxx.xxx.xxx"
Run Code Online (Sandbox Code Playgroud)

注意:逗号后不能有空格


str*_*x25 6

MongoDB 6.0.1

bindIp: 127.0.0.1;192.168.1.0
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl restart mongod
Run Code Online (Sandbox Code Playgroud)


yee*_*lan 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
Run Code Online (Sandbox Code Playgroud)

所以 mongo.conf 文件对空间很敏感,这是我碰巧添加的,应该已经注意到了。同样正如 @anhlc 指出的那样,96.88.169.145 不是虚拟机的有效 IP 地址。因此,这也导致了错误。

非常感谢你们的帮助!如果有人碰巧遇到同样的问题,希望这可以有所帮助。

  • 你的意思是我们应该写这样的东西:`bind_ip=127.0.0.1 192.168.184.155 96.88.169.145`即空格分隔而不是逗号分隔? (7认同)