89

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

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

rails s -b 0.0.0.0从现在开始不用每次都打字了,不知道有没有更优雅的解决方案,让我们仍然可以像rails s启动服务器一样简单地使用sth。也许:

  • 读取配置文件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

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

4

9 回答 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

ps:它基于:这个答案

于 2015-04-10T13:36:02.027 回答
47

您可以使用foremanProcfile使用您的自定义命令运行:

# 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

于 2015-02-23T08:40:13.057 回答
18

遇到了同样的问题。发现博客Make Rails 4.2 服务器监听所有接口

将以下内容添加到 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
于 2015-10-21T01:51:23.623 回答
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在那个文件上使用,所以可能有其他方法可以做到这一点,但这对我来说似乎是最合理的。

于 2019-04-30T19:12:39.070 回答
7

如果您设置默认选项,config/boot.rb则 rake 和 rails 的所有命令属性都会失败(例如:rake -Trails g model user)!因此,将其附加到bin/rails行后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'
于 2015-09-09T10:16:35.480 回答
1

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

/config/puma.rb

plugin :heroku

宝石文件

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

.env

PORT=8080

现在我可以使用rails s.

于 2017-03-07T18:09:12.507 回答
1

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

例子: HOST=0.0.0.0

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

于 2019-08-21T09:57:05.190 回答
1

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

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

bind 'tcp://0.0.0.0:3000'
于 2020-05-02T13:49:12.323 回答
0

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

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

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

于 2018-06-06T13:30:56.897 回答