Rails 4.2開発サーバーのデフォルトのバインディングIPを変更するにはどうすればよいですか?


88

チームのrailsアプリケーションを4.2にアップグレードした後、リリースノートに記載されているように、デフォルトのIP rails serverバインド先がlocalhostからに変更され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部分のために人々がレールサーバーを常に再起動しなければならないというグリッチを回避することです。

迷惑なポートフォワーディングを試しましたが、ホストマシンConnection Refusedにアクセスするとまだ取得できlocalhost:3000ます。私が試した2つの構成行は次のとおりです。

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の答えは、プーマを使用することです
prusswan

さらに別のRails 5の答え:env varを設定するHOST=0.0.0.0と、Rails開発サーバーはこの値を自動的に使用します。
トファーハント

回答:


71

私はここで同じ問題を抱えており、今日はより良い解決策を見つけました。このコードを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:そのベース:この答え


1
このアプローチでは、他のデフォルトが失われます。代替案については、以下のVanitasの回答を参照してください。
Mark Joseph Jorgensen

私はVanitaの答えを見てみる、同意
ringe

46

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


ありがとう。それが最善の解決策であることが判明した場合、私は数日以内にあなたの答えを受け入れます:)
Huang Tao

省略形foreman sも機能します-からのより簡単な移行かもしれませんrails s
Eliot Sykes

19

同じ問題に会った。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

1
この回答には、元のデフォルト(つまり、ポート3000)を失わないという追加の利点があります
Mark Joseph Jorgensen '25

7

デフォルトのオプションをオンにconfig/boot.rbすると、rakeおよびrailsのすべてのコマンド属性が失敗します(例:rake -Tまたはrails 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このようなファイルloks:

#!/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'

6

Rails 5.1.7とPuma 3.12.1の場合、選択した回答は機能しませんが、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

1

これが私が使っているより簡単な解決策です。私はすでにdotenvpuma-herokuが好き/必要なので、これらを使用してもうまくいかない場合は、これはあなたには向かないかもしれません。

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

これで、開発と本番の両方をで開始できrails sます。



1

dockerまたは別のツールを使用して環境変数を管理する場合、環境変数HOSTをバインドする必要のあるIPに設定できます。

例: HOST=0.0.0.0

docker.envDocker .envを使用する場合、またはforemanを使用する場合は、ファイルに追加してください。


0

Pumaを使用したRails 5の場合、選択した回答は機能しません。あなたはそのようなエラーを受け取るかもしれません:cannot load such file -- rails/commands/server

適切なソリューションのために以下を追加してconfig/puma.rbください:

bind 'tcp://0.0.0.0:3000'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.