無法從主機存取虛擬機器上的 Rails 伺服器

無法從主機存取虛擬機器上的 Rails 伺服器

我在虛擬機器上有一個 Rails 伺服器,我需要從主機存取本機。我已經嘗試過 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 本身:對於測試來說良好且安全,但對於生產甚至從不同計算機進行測試沒有用處。

如果您希望可以從任何其他電腦(包括您的 Windows 7 主機)存取 Rails,您需要告訴 Rails 綁定到 Debian 擁有的可從外部存取的 IP 位址(請參閱下文)。

然而,更簡單的方法是告訴 Rails 綁定到特殊的 IP 位址0.0.0.0,這意味著任何網路介面卡。因此,像這樣啟動 Rails 伺服器:

rails server -p 80 -b 0.0.0.0

將使任何可以在網路上看到您的虛擬機器的人都可以訪問您的網站。

即使其他兩個組件正常工作,這也可能仍然讓您感到困惑。

虛擬機器IP位址

您需要將瀏覽器指向 Debian 虛擬機,它是它自己的獨立電腦。

經驗法則localhost是它總是指同一台計算機。但是,出於網路目的,您的 Debian VM 是其自己的獨立電腦。如果您在 Windows 7 主機中使用 Web 瀏覽器,localhost則將始終引用您的 Windows 7 而不是其他內容。

您在這裡有兩個選擇:

  • 將 VirtualBox VM 適配器設定為橋接模式(如您在問題中提到的)。這會將您的 Debian 直接置於與 Windows 7 主機相同的外部/家庭/工作網路上。然後,您可以透過執行確定 Debian VM 的 IP ifconfig。尋找您的eth0或適配器的 IP eth<something>。將其插入瀏覽器的網址列。

  • 使用 NAT 適配器並VirtualBox 連接埠轉發。國際海事組織這更複雜。

Debian 防火牆

我已經有一段時間沒有在 Debian 上工作了,所以我不知道當前的預設值是什麼,但如果上述兩件事不起作用,那麼這可能值得研究一下。如果 Debian 運行防火牆,您需要開啟您希望從另一台電腦存取的任何連接埠。

希望這可以幫助 :)

相關內容