Rails 4.2在Vagrant上的服务器端口转发不起作用

46

我有一个安装了Rails示例应用程序的Vagrant虚拟机。该虚拟机已配置将Rails Webrick服务器的3000端口转发到我的主机3000端口。

config.vm.network "forwarded_port", guest: 3000, host: 3000

一切都按照许多示例中的配置进行了配置。

但是,当我尝试访问http://localhost:3000时,什么也没有发生。 我还尝试将其转发到其他随机端口,如8081、25600,但均未成功。 在VM中执行curl请求也没有得到任何东西(只有连接被对等方重置的消息),而在VM中执行curl请求却完全正常(正如预期)。

我的PC和VM都运行Ubuntu 12.04。我正在使用Ruby 2.2.0和Rails 4.2.0。

一个重要的问题是Apache正常工作。我将端口80转发到端口8080,并且一切正常。似乎问题只出现在Rails服务器上,即使当我使用其他端口(例如rails server -p 4000)时也是如此。

5个回答

91
Rails 4.2 现在默认绑定到 127.0.0.1 而不是 0.0.0.0
使用 bin/rails server -b 0.0.0.0 启动服务器即可解决问题。

我要做到它!每个服务器在虚拟机内部使用0.0.0.0吗?我不知道这个... - Victor Leal
不,这不是最安全的方法。0.0.0.0只是表示监听任何地址。更改意味着它只会响应来自虚拟机而不是主机的请求。这对于开发来说是可以的,在生产中不要这样做。 - Max Woolf
我也遇到了同样的问题。您有关于如何设置生产环境的建议吗?Rails应该绑定到特定的IP地址吗? - helsont
你不应该在生产环境中使用Webbrick,它只是为开发而设计的。 - Max Woolf
谢谢!我在使用 PHP Cake 3.X 时遇到了这个问题,但是现在已经解决了! - Jonas Lomholdt
谢谢!我在使用Symphony时遇到了这个问题,这个解决方法很有效! - rnpd

10

要在特定端口上运行:

rails server -b 0.0.0.0 -p 8520

4

用途:

rails s -b 0.0.0.0

或者

将以下内容添加到config/boot.rb中:

require 'rails/commands/server'

module Rails
  class Server
    new_defaults = Module.new do
      def default_options        
        default_host = Rails.env == 'development' ? '0.0.0.0' : '127.0.0.1'
        super.merge( Host: default_host )
      end
    end

    # Note: Module#prepend requires Ruby 2.0 or later
    prepend new_defaults
  end
end

并且与 rails s 一起工作


你的第二个解决方案非常好,谢谢!正在使用Rails 5.0.1。 - StringsOnFire

0

你可以使用别名,在Ubuntu中将其放置在~/.bash_aliases
我使用:
alias rs="rails server -b 0.0.0.0"

你必须重新加载终端才能使用它


0

这里有一个非常好的解释:Rails 4.2.0.beta2 - Can't connect to LocalHost?

我遇到了完全相同的问题,只是我的电脑是Mac机器。我使用了这个vagrantfile来使它工作(使用virtualbox 4.3.36)

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Use Ubuntu 14.04 Trusty Tahr 64-bit as our operating system
  config.vm.box = "ubuntu/trusty64"

  # Configurate the virtual machine to use 2GB of RAM
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end

  config.vm.provision "shell", inline: <<-SHELL
    ## Install necessary dependencies
    sudo apt-get --assume-yes install libsqlite3-dev libcurl4-openssl-dev git

    ## Install GPG keys and download rvm, ruby and rails
    curl -sSL https://rvm.io/mpapis.asc | gpg --import -
    curl -L https://get.rvm.io | bash -s stable --ruby
    curl -L https://get.rvm.io | bash -s stable --rails
    echo "[[ ls \"$HOME/.rvm/scripts/rvm\" ]] && . \"$HOME/.rvm/scripts/rvm\"" >> ~/.profile
    ## Adding vagrant user to the group that can access rvm
    usermod -G rvm vagrant
  SHELL

  # Forward the Rails server default port to the host
  config.vm.network :forwarded_port, guest: 3000, host: 3000

end

在虚拟机启动并运行后,我会在我的项目仓库中运行bundle install,然后运行rails server -b 0.0.0.0。 如上面链接的答案所指出的:

127.0.0.1:3000只允许在端口3000上从该地址进行连接,而0.0.0.0:3000将允许从任何地址连接到端口3000。

自Rails 4.2起,默认情况下仅接受来自本地主机的连接, 您只能从本地主机(例如VM内部)访问服务器; 另一台机器(例如VM的主机)的连接将无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接