จะเปลี่ยนการเชื่อมโยง IP เริ่มต้นของเซิร์ฟเวอร์การพัฒนา Rails 4.2 ได้อย่างไร


89

หลังจากอัปเกรดเป็นแอปพลิเครางทีมงานของเรา 4.2 เป็นเอกสารเผยแพร่ดังกล่าวเริ่มต้นของ IP rails serverกระหม่อมจะเปลี่ยนไปจากlocalhost0.0.0.0

เราพัฒนาด้วย Vagrant และต้องการให้เซิร์ฟเวอร์การพัฒนาสามารถเข้าถึงได้โดยตรงจากเบราว์เซอร์บนเครื่องโฮสต์

แทนที่จะพิมพ์rails s -b 0.0.0.0ทุกครั้งจากนี้ไปฉันสงสัยว่าจะมีวิธีแก้ปัญหาที่หรูหรากว่านี้หรือไม่เพื่อให้เรายังคงสามารถใช้ sth ได้อย่างง่ายดายเหมือนrails sเริ่มเซิร์ฟเวอร์ บางที:

  • ไฟล์ config rails sอ่านโดยที่ฉันสามารถแก้ไขค่า default binding 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

ไม่พบคำแนะนำที่เกี่ยวข้องในเอกสารอย่างเป็นทางการ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.


3
ราง 5 คำตอบ: stackoverflow.com/a/33852354/520567
akostadinov

รางปัจจุบัน 5 คำตอบคือใช้ Puma
prusswan

อีกคำตอบ Rails 5: ตั้งค่า env var HOST=0.0.0.0และเซิร์ฟเวอร์ Rails dev จะใช้ค่านี้โดยอัตโนมัติ
Topher Hunt

คำตอบ:


72

ฉันมีปัญหาเดียวกันที่นี่และวันนี้ฉันพบวิธีแก้ปัญหาที่ดีกว่า เพียงแค่ต่อท้ายรหัสนี้เข้ากับ 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 ด้านล่างสำหรับทางเลือกอื่น
Mark Joseph Jorgensen

ฉันเห็นด้วยลองดูคำตอบของ Vanita
ringe

47

คุณสามารถใช้หัวหน้าคนงานเพื่อเรียกใช้Procfileคำสั่งที่กำหนดเองของคุณ:

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

ตอนนี้เริ่มแอปพลิเคชัน Rails ของคุณด้วย:

foreman start

ข้อดีของหัวหน้าคนงานคือคุณสามารถเพิ่มแอปพลิเคชันอื่น ๆ ลงใน Procfile (เช่น sidekiq, mailcatcher)

สิ่งที่ไม่ดีเกี่ยวกับหัวหน้าคนงานเป็นว่าคุณมีการฝึกอบรมทีมงานของคุณเพื่อให้ทำงานแทนforeman startrails s


ขอบคุณ. ฉันจะยอมรับคำตอบของคุณในสองสามวันถ้ามันเป็นทางออกที่ดีที่สุด :)
Huang Tao

ย่อforeman sจะยังทำงาน - rails sอาจจะมีการเปลี่ยนแปลงได้ง่ายขึ้นจาก
Eliot Sykes

18

พบปัญหาเดียวกัน. พบบล็อกยี่ห้อ 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

9

สำหรับ 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

7

หากคุณใส่ตัวเลือกเริ่มต้นconfig/boot.rbแอตทริบิวต์คำสั่งทั้งหมดสำหรับคราดและรางล้มเหลว (ตัวอย่าง: rake -Tหรือrails g model user)! ดังนั้นให้ผนวกสิ่งนี้เข้ากับbin/railsบรรทัดหลังrequire_relative '../config/boot'และรหัสจะถูกเรียกใช้สำหรับคำสั่งเซิร์ฟเวอร์รางเท่านั้น:

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

นี่เป็นวิธีที่ง่ายกว่าที่ฉันใช้ ฉันชอบ / ต้องการdotenvและpuma-heroku อยู่แล้วดังนั้นหากใช้สิ่งเหล่านี้ไม่ได้ผลสำหรับคุณสิ่งนี้อาจไม่เหมาะกับคุณ

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

ตอนนี้ฉันสามารถเริ่มทั้งการพัฒนาและการผลิตด้วยrails s.


1

หากคุณใช้นักเทียบท่าหรือเครื่องมืออื่นในการจัดการตัวแปรสภาพแวดล้อมคุณสามารถตั้งค่าHOSTตัวแปรสภาพแวดล้อมเป็น IP ที่คุณต้องการผูก

ตัวอย่าง: HOST=0.0.0.0

เพิ่มลงในdocker.envไฟล์หากคุณใช้ Docker หรือ.envถ้าคุณใช้หัวหน้าคนงาน


1

สำหรับ Rails 5 กับ Puma คำตอบที่เลือกใช้ไม่ได้ คุณอาจได้รับข้อผิดพลาดดังกล่าว: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.