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

Posted

技术标签:

【中文标题】Vagrant上的Rails 4.2服务器端口转发不起作用【英文标题】:Rails 4.2 Server port forwarding on Vagrant does not work 【发布时间】:2015-03-04 03:43:54 【问题描述】:

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

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

所有的配置都如许多示例所示。

但是,当我尝试访问 http://localhost:3000 时,什么也没有发生。我也尝试转发到其他随机端口,如 8081、25600,但没有成功。执行 curl 请求也不会得到任何东西(只是 Connection reset by peer 消息),并且 VM 内部的 curl 请求可以完美运行(如预期的那样)。

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

重要的一点是 Apache 可以正常工作。我将端口 80 转发到端口 8080,一切正常。似乎问题出在 Rails 服务器上,即使我使用其他端口(例如rails server -p 4000

【问题讨论】:

【参考方案1】:

在这里找到非常好的解释:Rails 4.2.0.beta2 - Can't connect to LocalHost?

我遇到了完全相同的问题,只是我的 PC 是 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 默认只接受来自 localhost 的连接, 您只能从本地主机访问服务器(例如,在虚拟机内部); 来自另一台机器(例如 VM 的主机)的连接将无法正常工作。

【讨论】:

【参考方案2】:

使用

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【参考方案3】:

您可以使用别名,在 Ubuntu 上将其放入 ~/.bash_aliases我使用:alias rs="rails server -b 0.0.0.0"您必须重新加载终端才能使用它

【讨论】:

【参考方案4】:

在特定端口上运行:

rails server -b 0.0.0.0 -p 8520

【讨论】:

【参考方案5】:

Rails 4.2 现在默认绑定到127.0.0.1,而不是0.0.0.0

使用bin/rails server -b 0.0.0.0 启动服务器,它应该对其进行排序。

【讨论】:

我会的!在 VM 内时,每台服务器都应该使用 0.0.0.0 吗?我不知道... 不,这不是最安全的方法。 0.0.0.0 只是意味着监听任何地址。更改意味着它将仅响应来自 VM 的请求,而不是您的主机。这对开发来说很好,不要在生产中这样做。 我也遇到了同样的问题。您对设置生产环境有什么建议?是否应该绑定特定的 IP 轨道? 你不应该在生产中使用 webbrick,它只是为开发而设计的。 谢谢!使用 php Cake 3.X 有这个问题,这个解决了!

以上是关于Vagrant上的Rails 4.2服务器端口转发不起作用的主要内容,如果未能解决你的问题,请参考以下文章

vagrant配置端口转发

使用 localhost 从主机访问 Vagrant 机器上的 symfony Web 服务器

端口使用Vagrant转发时连接重置

Vagrant的端口转发不起作用[关闭]

从虚拟集群转发 Apache Hue 端口?

在现有的vagrant box上添加端口转发