【问题标题】:Rails 4.2 Server port forwarding on Vagrant does not workVagrant上的Rails 4.2服务器端口转发不起作用
【发布时间】: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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 vagrant ruby-on-rails-4.2


    【解决方案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 有这个问题,这个解决了!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-24
          • 2014-04-15
          • 2015-04-26
          • 1970-01-01
          • 2016-01-14
          • 2016-01-13
          相关资源
          最近更新 更多