如何更改Rails 4.2开发服务器的默认绑定ip?

时间:2015-02-23 07:02:22

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

将我们团队的rails应用程序升级到4.2之后,如release note所述,默认的ip rails server绑定从localhost更改为0.0.0.0

我们使用Vagrant开发,并希望可以直接从主机上的浏览器访问开发服务器。

我不知道从现在开始每次都输入rails s -b 0.0.0.0,我想知道是否还有更优雅的解决方案,这样我们仍然可以使用像rails s那样简单的启动服务器。也许:

  • 配置文件rails s读取我可以修改默认绑定ip的位置(不使用-c
  • 使用vagrant向前移动(尝试但失败,请参阅下面遇到的问题)
  • 一个猴子补丁到机架,它改变默认绑定ip

这背后的真正目标是我希望我们团队之间的升级顺利进行,避免由于缺少-b 0.0.0.0部分而导致人们不断重启其rails服务器的故障。

我尝试了流浪汉端口转发,但当我在主机上访问Connection Refused时仍然获得localhost:3000。我尝试的两个配置行是:

config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000

在官方文档中未找到任何相关说明。任何帮助将不胜感激。

8 个答案:

答案 0 :(得分:68)

我在这里遇到同样的问题,今天我发现了一个更好的解决方案。只需将此代码附加到config / boot.rb,它就可以与vagrant一​​起使用。

require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge(Host:  '0.0.0.0', Port: 3000)
    end
  end
end

ps:它基于:this answer

答案 1 :(得分:45)

您可以使用foreman使用自定义命令运行Procfile

# Procfile in Rails application root
web:     bundle exec rails s -b 0.0.0.0

现在使用以下命令启动Rails应用程序:

foreman start

关于foreman的好处是你可以将其他应用程序添加到Procfile(如sidekiq,mailcatcher)。

关于领班的坏处是,你必须训练你的团队运行foreman start而不是rails s

答案 2 :(得分:18)

遇到同样的问题。找到了博客Make Rails 4.2 server listens to all interfaces

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

require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_bk :default_options
    def default_options
      default_options_bk.merge!(Host: '0.0.0.0')
    end
  end
end

答案 3 :(得分:1)

这是我正在使用的更简单的解决方案。我已经喜欢/需要dotenvpuma-heroku,所以如果使用这些不适合你,那么这可能不适合你。

<强> /config/puma.rb

plugin :heroku

<强>的Gemfile

gem 'dotenv-rails', groups: [:development, :test]

<强> .ENV

PORT=8080

现在我可以使用rails s启动dev和production。

答案 4 :(得分:1)

切换到Puma并在port中指定config/puma.rb,例如:

port        ENV.fetch("PORT") { 3000 }

显然它将绑定到指定端口的0.0.0.0:https://github.com/puma/puma/issues/896

答案 5 :(得分:1)

对于带有Puma 3.12.1的Rails 5.1.7,选择的答案不起作用,但是我通过将以下内容添加到我的config/puma.rb文件中来完成了该任务:

set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port

port ENV.fetch('PORT') { 3000 }

我通过检查dsl file确定了这一点。它在该文件上使用instance_eval,因此可能有其他方法可以执行此操作,但这对我来说似乎是最合理的。

答案 6 :(得分:0)

如果使用docker或其他工具来管理环境变量,则可以将HOST环境变量设置为需要绑定的IP。

示例: HOST=0.0.0.0

如果使用Docker,则将其添加到docker.env文件中;如果使用工头,则将其添加到.env中。

答案 7 :(得分:0)

对于带有Puma的Rails 5,选择的答案不起作用。您可能会收到以下错误消息:cannot load such file -- rails/commands/server

要获得适当的解决方案,请在config/puma.rb中添加以下内容:

bind 'tcp://0.0.0.0:3000'