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


88

发行说明所述,在将我们团队的rails应用程序升级到4.2之后,默认的ip rails serverbinds更改为localhostfrom 0.0.0.0

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

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

  • 一个配置文件rails s读取我可以在其中修改默认绑定ip的地方(不使用-c
  • 带有无业游民的端口转发(尝试但失败,请参阅下面遇到的问题)
  • 一个要安装的猴子补丁,它将更改默认的绑定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

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



当前的rails 5答案是使用Puma
prusswan

Rails 5的另一个答案是:设置env var HOST=0.0.0.0,Rails开发服务器将自动使用该值。
Topher Hunt

Answers:


71

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

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

ps:其依据:这个答案


1
使用这种方法,您将失去其他默认值。另请参阅下面的Vanitas答案
马克·约瑟夫·乔根森

我同意,看看Vanita的答案

46

您可以使用领班通过Procfile自定义命令运行a :

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

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

foreman start

领班的好处是您可以将其他应用程序添加到Procfile中(例如sidekiq,mailcatcher)。

工头的坏处是你必须训练团队来foreman start代替rails s


谢谢。如果事实证明是最佳解决方案,我会在几天后接受您的答复:)
Huang Tao

缩写foreman s也可以-可能更容易从过渡rails s
艾略特·赛克斯


8

对于带有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在该文件上使用,因此可能有其他方法可以执行此操作,但这对我来说似乎是最合理的。


谢谢,您救了我!!
Proz1g

7

如果在默认选项上放了config/boot.rbrake和rails的所有命令属性都会失败(例如:rake -Trails g model user)!因此,将其附加到bin/railsafter行,require_relative '../config/boot'并且仅对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

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'

1

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

/config/puma.rb

plugin :heroku

宝石文件

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

.env

PORT=8080

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



1

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

例: HOST=0.0.0.0

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


0

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

要获得正确的解决方案,请在上添加以下内容config/puma.rb

bind 'tcp://0.0.0.0:3000'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.