我在虛擬機器上有一個 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
或適配器的 IPeth<something>
。將其插入瀏覽器的網址列。使用 NAT 適配器並VirtualBox 連接埠轉發。國際海事組織這更複雜。
Debian 防火牆
我已經有一段時間沒有在 Debian 上工作了,所以我不知道當前的預設值是什麼,但如果上述兩件事不起作用,那麼這可能值得研究一下。如果 Debian 運行防火牆,您需要開啟您希望從另一台電腦存取的任何連接埠。
希望這可以幫助 :)