web-dev-qa-db-ja.com

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

チームのRailsアプリケーションを4.2にアップグレードした後、 リリースノート に記載されているように、デフォルトのip Rails serverバインド先は0.0.0.0からlocalhostに変更されます。

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が表示されます。私が試した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

公式ドキュメントに関連する指示が見つかりませんでした。任意の助けをいただければ幸いです。

81
Huang Tao

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

70
imarcelolz

foreman を使用して、カスタムコマンドでProcfileを実行できます。

# 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を実行するようにチームを訓練する必要があることです。

45
zwippie

同じ問題に出会った。ブログを見つけました 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
18
Bian Jiaping

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

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を使用しているため、おそらく他の方法もありますが、これは私にとって最も合理的であると思われました。

1
jsmartt

私が使用しているより簡単なソリューションを次に示します。私はすでに dotenvpuma-herok が好き/必要なので、それらを使用してもうまくいかない場合、これはあなたには向かないかもしれません。

/ config/puma.rb

plugin :heroku

Gemfile

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

。env

PORT=8080

これで、Rails sを使用してdevとproductionの両方を開始できます。

1
John Bachir

Puma に切り替えて、config/puma.rbportを指定します。例:

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

どうやら、指定されたポートの0.0.0.0にバインドされます: https://github.com/puma/puma/issues/896

1
prusswan

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

例:Host=0.0.0.0

Dockerを使用する場合はdocker.envファイルに、フォアマンを使用する場合は.envファイルに追加します。

0
Paulo Fidalgo