我在 VMware 云中拥有两台虚拟机,它们属于同一个 VApp,因此位于同一个边缘网关后面。它们都有自己不同的内部 IP 地址,但我使用边缘网关的 IP 地址和端口组合将服务从外部路由到它们。我在一台虚拟机上运行了一个 Grails 应用程序,该应用程序需要与 MongoDB 实例一起工作。我让该 MongoDB 实例作为服务在另一台虚拟机上运行。问题是,当 Grails 应用程序启动时,它无法使用边缘网关的 IP 地址和端口 27017 连接另一台虚拟机上的 MongoDB 实例。
我有一个适当的 NAT 规则来将此类请求转发到同一端口 27017 上具有 MongoDB 的 VM。我还设置了适当的防火墙规则。
一些有用的诊断信息,Grails 应用程序可以成功联系我在 Amazon Web Services 云上运行的另一个 MongoDB 实例。
如果我在本地机器上运行 Robomongo(MongoDB GUI 客户端),它可以成功联系在我的 VMware VM 上运行的 MongoDB 实例。
我无法在一个虚拟机上的 Grails 应用程序和另一个虚拟机上的 MongoDB 之间建立联系。我的 Grails 应用程序收到错误消息,提示无法找到 MongoDB。
编辑:我还发现,如果从我的本地 Linux 机器上,我在提示符下输入以下内容:
telnet [vmwareEdgeGateway's IP] 27017
它会建立连接。我希望这能证明我的 NAT 和防火墙设置配置正确。
答案1
我通过使用运行 MongoDB 的虚拟机的内部 IP 地址解决了这个问题。而不是使用边缘网关的 IP 地址来访问它。那些比我聪明的人也建议我,这也是一种更安全的方法。我只是想把答案贴出来,以防将来有人来寻求这个主题的帮助。