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

90

在我们团队将Rails应用程序升级到4.2版本后,正如发布说明提到的那样,rails server默认绑定的IP从0.0.0.0改为了localhost

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

我想知道是否有更加优雅的解决方案,而不是每次都要输入rails s -b 0.0.0.0,这样我们仍然可以使用rails s来启动服务器。 可能的解决方案包括:

  • 一个配置文件,rails s可以读取并在其中修改默认绑定的IP(而无需使用-c
  • 使用Vagrant进行端口转发(已尝试但失败,下面看到了遇到的问题)
  • 对Rack进行Monkey Patch,以更改默认绑定的IP

真正的目标是使我们团队内的升级过程变得顺畅,避免因缺少-b 0.0.0.0而不得不不断重启Rails服务器的问题。

我尝试了Vagrant的端口转发,但在主机上访问localhost:3000时仍然出现Connection Refused的错误。 我尝试过的两行配置代码是:

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

在官方文档中没有找到任何相关的说明。 感谢任何帮助。


3
Rails 5 答案: https://dev59.com/9ZHea4cB1Zd3GeqPn1Uo#33852354在 Rails 5 中,ActiveRecord::Relation#find_each 和 ActiveRecord::Relation#find_in_batches 方法现在都支持传递一个关键字参数 batch_size,以指定每个批次中要加载的记录数。这些方法也现在返回一个 Enumerator 对象,使它们更易于使用。例如:Person.where("age > 21").find_each(batch_size: 5000) do |person| # ... end Person.where("age > 21").find_in_batches(batch_size: 5000) do |people| people.each { |person| puts person.name } end - akostadinov
当前 Rails 5 的解决方案是使用 Puma。 - prusswan
又一个Rails 5的答案:设置环境变量HOST=0.0.0.0,Rails开发服务器会自动使用此值。 - Topher Hunt
9个回答

72

我也遇到了同样的问题,今天我找到了一个更好的解决方案。只需要将这段代码追加到你的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

提示:该内容基于:此答案


1
使用这种方法,您会失去其他默认设置。请参考Vanitas的答案以获取另一种选择。 - Mark Joseph Jorgensen
我同意,看看Vanita的答案。 - ringe

48

你可以使用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的不足之处在于,您必须训练您的团队运行foreman start而不是rails s


谢谢。如果您的翻译是最佳解决方案,我会在几天内接受您的答案 :) - Huang Tao
缩写的 foreman s 也可以使用 - 这可能更容易从 rails s 过渡。 - Eliot Sykes

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

1
这个答案的附加好处是不会丢失原始默认值(即端口3000!)。 - Mark Joseph Jorgensen

12

对于使用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文件来确定这一点。它在该文件上使用instance_eval,因此可能有其他方法来实现,但对我来说,这似乎是最合理的。


7
如果您在 config/boot.rb 上使用默认选项,则所有 rake 和 rails 命令属性都会失败(例如:rake -Trails g model user)!因此,在 require_relative '../config/boot' 行后将以下内容附加到 bin/rails 中,该代码仅在运行 rails 服务器命令时执行:
if ARGV.first == 's' || ARGV.first == 'server'
  require 'rails/commands/server'
  module Rails
    class Server
      def default_options
        super.merge(Host:  '0.0.0.0', Port: 3000)
      end
    end
  end
end
< p > bin/rails 文件如下:

#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'

# Set default host and port to rails server
if ARGV.first == 's' || ARGV.first == 'server'
  require 'rails/commands/server'
  module Rails
    class Server
      def default_options
        super.merge(Host:  '0.0.0.0', Port: 3000)
      end
    end
  end
end

require 'rails/commands'

2
如果您使用docker或其他工具来管理环境变量,您可以设置HOST环境变量为需要绑定的IP。
例如:HOST=0.0.0.0 如果您使用Docker,请将其添加到docker.env文件中;如果您使用foreman,请将其添加到.env文件中。

1

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

/config/puma.rb

plugin :heroku

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

.env

PORT=8080

现在我可以使用rails s同时启动开发环境和生产环境。

1
对于使用Puma的Rails 5,所选答案不起作用。您可能会遇到以下错误:cannot load such file -- rails/commands/server 要获得正确的解决方案,请将以下内容添加到config/puma.rb中:
bind 'tcp://0.0.0.0:3000'

0

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