Rails 4.2 개발 서버의 기본 바인딩 IP를 변경하는 방법은 무엇입니까?


88

릴리스 노트에서 언급했듯이 우리 팀의 레일 애플리케이션을 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).
  • 방랑자와 함께 포트 포워드 (시도했지만 실패했습니다. 아래에서 발생한 문제 참조)
  • 랙에 원숭이 패치, 기본 바인딩 IP 변경

이것의 진정한 목표는 사람들이 -b 0.0.0.0부품 누락으로 인해 레일 서버를 지속적으로 다시 시작해야하는 결함을 피하면서 우리 팀 사이에서 원활하게 업그레이드하기를 원한다는 것 입니다.

방랑 포트 포워딩을 시도했지만 호스트 컴퓨터를 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

공식 문서에서 관련 지침을 찾지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.



현재 레일 5 대답은 퓨마를 사용하는 것입니다
prusswan

또 다른 Rails 5 답변 : env var을 설정 HOST=0.0.0.0하면 Rails dev 서버가이 값을 자동으로 사용합니다.
Topher Hunt

답변:


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

추신 : 기반 : 이 답변


1
이 방법을 사용하면 다른 기본값 을 잃게됩니다 . 대안은 아래 Vanitas의 답변을 참조하십시오 .
Mark Joseph Jorgensen 2016

동의합니다. Vanita의 답변을 살펴보십시오
ringe

46

foreman 을 사용 Procfile하여 사용자 지정 명령으로 a를 실행할 수 있습니다 .

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

이제 다음과 같이 Rails 애플리케이션을 시작합니다.

foreman start

foreman의 좋은 점은 (sidekiq, mailcatcher와 같은) Procfile에 다른 응용 프로그램을 추가 할 수 있다는 것입니다.

감독의 나쁜 점은 팀 foreman startrails s.


감사. 나는 그것이 최선의 해결책으로 밝혀지면 며칠 안에 ur 대답을 받아 들일 것입니다 :)
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)
마크 조셉 젠슨

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.rb하면 rake 및 rails에 대한 모든 명령 속성이 실패합니다 (예 : rake -T또는 rails g model user)! 따라서 이것을 bin/rails줄 뒤에 추가 require_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파일은 다음과 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'

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를 사용하거나 .envforeman을 사용하는 경우 파일에 추가하십시오 .


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.