无法从主机访问虚拟机上的 Rails 服务器

无法从主机访问虚拟机上的 Rails 服务器

我在虚拟机上有一个 rails 服务器,我需要从主机访问 localhost。我尝试了 NAT(通过端口转发 - 客户端的端口 80 和 3000)和桥接适配器,但似乎都不起作用。

在这两种情况下,我都能访问端口 80,但尝试连接端口 3000 上的本地主机时失败(因此访问 xampp 服务器没有问题)。

如果您知道如何在服务器位于客户端时从主机访问本地主机,请告诉我。

我的客户机上有 Linux(Debian),主机端上有 Windows 7 - 我使用 VirtualBox。

答案1

这里至少有三个独立的组件在起作用,每个组件都需要正确配置。

Rails 绑定地址

当 Rails(或其他服务器应用程序)打开以接收网络连接时,它将绑定到 IP 和端口。如果传入请求与这两者不匹配,它将不会接受连接。来自rails server --help

Usage: rails server [mongrel, thin etc] [options]
-p, --port=port                  Runs Rails on the specified port.
                                 Default: 3000
-b, --binding=IP                 Binds Rails to the specified IP.
                                 Default: localhost
...

因此,默认情况下,Rails 只接受发送到其localhost(环回)网络适配器(称为lo)的请求。由于此适配器只能从同一台计算机内访问,因此它唯一接受的请求将来自 Debian VM 本身:对于测试来说很好而且安全,但对于生产或从另一台计算机进行测试来说却毫无用处。

如果您希望您的 Rails 可以从任何其他计算机(包括您的 Windows 7 主机)访问,您需要告诉 Rails 绑定到 Debian 具有的可从外部访问的任何 IP 地址(见下文)。

不过,更简单的方法是告诉 Rails 绑定到特殊 IP 地址0.0.0.0,这意味着任何网络适配器. 因此,像这样启动你的 Rails 服务器:

rails server -p 80 -b 0.0.0.0

将使任何可以在网络上看到您的 VM 的人都可以访问您的网站。

即使其他两个组件正常工作,这也可能会让您陷入困境。

虚拟机 IP 地址

您需要将浏览器指向 Debian 虚拟机,它是其自己的独立计算机。

经验法则localhost是它始终指同一台计算机。但是,出于联网目的,您的 Debian VM 是其自己的独立计算机。如果您在 Windows 7 主机中使用 Web 浏览器,localhost则将始终指您的 Windows 7,而不是其他任何计算机。

您有两个选择:

  • 将 VirtualBox VM 适配器设置为 Bridge 模式(如您在问题中提到的)。这会将您的 Debian 直接置于与您的 Windows 7 主机相同的外部/家庭/工作网络上。然后,您可以通过运行 来确定您的 Debian VM 的 IP ifconfig。查找您的eth0eth<something>适配器的 IP。将其插入浏览器的地址栏。

  • 使用 NAT 适配器和VirtualBox 端口转发. 在我看来,这更加复杂。

Debian 防火墙

我已经有一段时间没有使用 Debian 了,所以我不知道当前的默认设置是什么,但如果上述两件事不起作用,那么这可能值得研究一下。如果 Debian 正在运行防火墙,您需要打开您希望从另一台机器访问的任何端口。

希望这可以帮助 :)

相关内容