Rails4.2开发服务器默认绑定ip如何修改?

How to change the default binding ip of Rails 4.2 development server?

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

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

以后不用每次都输入rails s -b 0.0.0.0了,不知道有没有更优雅的方案,让我们仍然可以像rails s一样简单的启动服务器。也许:

这背后的真正目标是我希望我们的团队能够顺利升级,避免由于缺少 -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

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

您可以使用 foreman 到 运行 a 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

我在这里遇到了同样的问题,今天我找到了更好的解决方案。只需将此代码附加到您的 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

如果您将默认选项放在 config/boot.rb 上,那么 rake 和 rails 的所有命令属性都会失败(例如:rake -Trails g model user) ! 因此,将此附加到 bin/railsrequire_relative '../config/boot' 之后,代码仅针对 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

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'

遇到同样的问题。找到博客 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

这是我正在使用的一个更简单的解决方案。我已经 like/need dotenv and puma-heroku,所以如果使用这些对你不起作用那么这可能不适合你。

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

现在我可以用 rails s 开始开发和生产了。

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

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

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

对于带有 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,因此可能还有其他方法可以做到这一点,但这对我来说似乎是最合理的。

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

示例: HOST=0.0.0.0

如果您使用 Docker 或 .env 如果您使用工头,请将其添加到 docker.env 文件。

对于 Puma 的 Rails 5,所选答案无效。你可能会得到这样的错误:cannot load such file -- rails/commands/server

为了获得正确的解决方案,请将以下内容添加到 config/puma.rb

bind 'tcp://0.0.0.0:3000'