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

时间:2015-03-17 20:32:43

标签: mongodb virtual-machine remote-access

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

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

环境如下:

  • 虚拟机的专用IP: 192.168.184.155

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


我更改了 /etc/mongod.conf文件中的 bind_ip

bind_ip = 127.0.0.1

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采用逗号分隔的列表,这让我很困惑。

提前感谢您的帮助。

18 个答案:

答案 0 :(得分:52)

用逗号分隔的逗号分隔的Ips在mongo 3.2.7中为我工作:

bindIp = [127.0.0.1, 192.168.184.155, 96.88.169.145]

答案 1 :(得分:20)

你可以通过以下方式做到:

bindIp: [172.31.60.184,127.0.0.1]

请记住不要在逗号后面加上空格。

答案 2 :(得分:4)

我在SUSE 12.x上运行3.6并且使用逗号分隔的IP列表时出现问题。我解决了这个问题         bindIp:0.0.0.0

答案 3 :(得分: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地址。因此,这也会导致错误。

非常感谢您的帮助!希望如果有人遇到同样的问题,这可能会有所帮助。

答案 4 :(得分:2)

在Mongo 3。*中,

使用支架,例如

net:
    port: 27017
    bindIp : [127.0.0.1,10.0.0.2,10.0.0.3]

答案 5 :(得分:2)

使用以下版本的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"

注意:逗号后不能有空格

答案 6 :(得分:1)

我使用逗号,没有空格和FQDN在我的3.2版服务上成功添加了第二个ip

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

答案 7 :(得分:1)

我的Ubuntu16.04 LTS上的 mongodb版本3.6 中的情况是您不需要将IP地址放在方括号“[]”中。 删除逗号后面的空格解决mongod日志中失败的连接问题(/var/log/mongodb/mongod.log)

NETWORK  [initandlisten] getaddrinfo(" xxx.xxx.xxx.xxx") failed: Name or service not known

bindIp: 127.0.0.1修改为bindIp: 127.0.0.1,xxx.xxx.xxx.xxx (注意IP之间没有逗号)后,主机IP正在监听如下:

xxx@xxxx:/var/log/mongodb$ sudo netstat -plnt |egrep mongod
tcp        0      0 xxx.xxx.xxx.xxx:27017   0.0.0.0:*               LISTEN      30747/mongod    
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      30747/mongod 

答案 8 :(得分:1)

在我的情况下,解决方案是将逗号分隔的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 2017年11月2日 分配器:tcmalloc 模块:无 构建环境:     distarch:x86_64     target_arch:x86_64

答案 9 :(得分:0)

对于 4.4.6,所以 - 让我们假设系列 4.x(也许是系列 3.x 的一些)

正确的语法是:

  • bindIp: 127.0.0.1,<private_host_ip>,<public_host_ip>

对于每个新 IP,只需使用 , 且不带任何空格

对于 LAN 访问必须使用 private_host_ip,您可以分别使用 ipconfigip a for WindowsLinux知道ip值。 当然对于公共 WAN 访问必须使用 <public_host_ip>,这与您的 ISP 相关

警告 ips - private_host_ip<public_host_ip> - 都是您的 MongoDB 服务器 运行的位置,不是远程客户端。因此存在错误的假设,即添加每个新 IP,其中每个 IP 代表远程 客户端 IP 地址(不同于 服务器 IP地址 - LAN 和/或 WAN),它正确。

注意为了避免出现问题,最好使用静态 ip,私有通过您的路由器,第二个通过您的 ISP。

答案 10 :(得分:0)

对于MongoDB服务器版本:3.6.8用逗号分隔的列表对我有用。逗号后有无空格。

bind_ip = 127.0.0.1, 192.168.0.104
bind_ip = 127.0.0.1,192.168.0.104

但是,在[]中添加附件失败,并在MongoDB日志中出现以下错误

bind_ip = [127.0.0.1,192.168.0.104]
getaddrinfo("[127.0.0.1") failed: Name or service not known

bind_ip = [127.0.0.1, 192.168.0.104]
getaddrinfo("[127.0.0.1") failed: Name or service not known

答案 11 :(得分:0)

默认的/etc/mongod.conf文件具有以下用于网络接口的条目:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

这对应于命令行上的--bind-ip arg参数。注意将破折号转换为驼峰式。要将VM中运行的数据库公开给主机,最简单的方法是将数据库绑定到所有接口以进行测试。这将涵盖VM使用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的VM上运行mongod,则默认端口27017将不会暴露给主机。必须将主机上的端口映射到来宾VM中的该端口。这超出了此答案的范围,但是一些研究将提供一种用于您正在使用的VM软件(VirtualBox,VMware等)的方法。

答案 12 :(得分:0)

Amazon-linux2 |操作系统MongoDB Shell版本:3.0.15

这是需要在最新配置中完成的方式

#network interfaces
net:
  port: 27017
  bindIp: [xxx.xxx.xxx.xxx,127.0.0.1]  # Listen to local interface only, comment to listen on all interfaces.

干杯!

答案 13 :(得分:0)

对于那些仍然想知道的人-问题不是语法,而是您输入的地址

阅读this answer

答案 14 :(得分:0)

具有逗号分隔的IP地址的bindIp规则仅适用于已知的以太网接口或0.0.0.0和127.0.0.1规则。您只能使用系统的网络接口卡的IP地址。如果此列表包含未知的IP地址(即另一个系统的IP),则您的MongoDb实例将不会重新启动,因此您将无法连接。要检查您的MongoDb实例是否正在运行,请运行以下命令:

$ sudo systemctl status mongod

如果您想使您的MongoDb实例可用于网络上的其他系统,则需要绑定与专用网络关联的本地IP。要轻松确定网络接口配置,只需从命令行运行ifconfig:

$ ifconfig

这将列出您可以在bindIp规则中使用的所有可用IP地址。最肯定的是,您使用的IP地址96.88.169.145不是有效的IP地址,或系统未知。

答案 15 :(得分:0)

就我而言,使用 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

答案 16 :(得分:-1)

Ubuntu 16.04-> MongoDB Shell版本:2.6.10

对我来说,以下作品:

bind_ip = [127.0.0.1; X.X.X.X]

请注意,我有一个;而不是,

答案 17 :(得分:-9)

如果您只想通过网络连接到本机,则 NOT 需要修改bind_ip值。

在您的情况下,您需要按照以下步骤操作。

  1. 设置远程计算机以阻止与端口27017的所有连接
  2. 启用远程计算机以仅接受来自本地计算机的连接
  3. 使用MongoDB设置凭据
  4. 使用凭据与客户端连接。
  5. 如果您不确定如何执行此任何步骤。查看我撰写的博客文章,其中详细介绍了如何执行此操作。

    Blog Post

    希望这有帮助。