Làm cách nào để thay đổi ip ràng buộc mặc định của máy chủ phát triển Rails 4.2?


88

Sau khi nâng cấp ứng dụng rails của nhóm chúng tôi lên 4.2, như ghi chú phát hành đã đề cập, ip mặc định rails serverliên kết với được thay đổi thành localhostfrom 0.0.0.0.

Chúng tôi phát triển với Vagrant và muốn máy chủ phát triển có thể truy cập trực tiếp từ trình duyệt trên máy chủ.

Thay vì gõ rails s -b 0.0.0.0mỗi lần từ bây giờ, tôi tự hỏi liệu có giải pháp nào tốt hơn không, để chúng ta vẫn có thể sử dụng sth đơn giản như rails sđể khởi động máy chủ. Có lẽ:

  • một tệp cấu hình rails sđọc nơi tôi có thể sửa đổi ip ràng buộc mặc định (mà không cần sử dụng -c)
  • chuyển tiếp với vagrant (đã thử nhưng không thành công, hãy xem sự cố gặp phải bên dưới)
  • một bản vá khỉ vào giá đỡ, thay đổi ip ràng buộc mặc định

Mục tiêu thực sự đằng sau điều này là tôi muốn việc nâng cấp diễn ra suôn sẻ trong nhóm của chúng tôi, tránh trục trặc khiến mọi người sẽ phải liên tục khởi động lại máy chủ rails của họ do -b 0.0.0.0phần bị thiếu .

Tôi đã thử chuyển tiếp cổng lang thang, nhưng vẫn nhận được Connection Refusedkhi tôi truy cập localhost:3000trên máy chủ. Hai dòng cấu hình tôi đã thử là:

config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000

Không tìm thấy bất kỳ hướng dẫn liên quan nào trong tài liệu chính thức. Bất kỳ trợ giúp sẽ được đánh giá cao.



ray hiện tại 5 câu trả lời là sử dụng Puma
prusswan

Tuy nhiên, một câu trả lời khác của Rails 5: đặt env var HOST=0.0.0.0và máy chủ nhà phát triển Rails sẽ tự động sử dụng giá trị này.
Topher Hunt

Câu trả lời:


71

Tôi đang gặp vấn đề tương tự ở đây và hôm nay tôi đã tìm thấy giải pháp tốt hơn. Chỉ cần nối mã này vào config / boot.rb của bạn và nó sẽ hoạt động với 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: Nó dựa trên: câu trả lời này


1
Với cách tiếp cận này, bạn sẽ mất các giá trị mặc định khác . Hãy xem câu trả lời của Vanitas bên dưới để có giải pháp thay thế.
Mark Joseph Jorgensen

Tôi đồng ý, hãy xem câu trả lời của Vanita
đổ chuông vào

46

Bạn có thể sử dụng quản đốc để chạy một Procfilevới các lệnh tùy chỉnh của mình:

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

Bây giờ hãy bắt đầu ứng dụng Rails của bạn với:

foreman start

Ưu điểm của foreman là bạn có thể thêm các ứng dụng khác vào Procfile (như sidekiq, mailcatcher).

Điều tồi tệ của quản đốc là bạn phải đào tạo đội của mình để điều hành foreman startthay vì rails s.


cảm ơn. Tôi sẽ chấp nhận câu trả lời ur trong một vài ngày nếu nó hóa ra là giải pháp tốt nhất :)
Huang Tao

Viết tắt foreman scũng sẽ hoạt động - có thể là một chuyển đổi dễ dàng hơn từ rails s.
Eliot Sykes

19

Gặp vấn đề tương tự. Tìm thấy máy chủ blog Make Rails 4.2 lắng nghe tất cả các giao diện .

Thêm phần sau vào 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
câu trả lời này có thêm lợi ích là không làm mất các giá trị mặc định ban đầu (cụ thể là cổng 3000!)
Mark Joseph Jorgensen

8

Đối với Rails 5.1.7 với Puma 3.12.1, câu trả lời đã chọn không hoạt động, nhưng tôi đã hoàn thành nó bằng cách thêm phần sau vào config/puma.rbtệp của mình :

set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port

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

Tôi xác định điều này bằng cách kiểm tra tệp dsl . Nó sử dụng instance_evaltrên tệp đó, vì vậy có lẽ có nhiều cách khác để làm điều đó, nhưng điều này có vẻ hợp lý nhất đối với tôi.


Cảm ơn bạn, bạn đã cứu tôi !!
Proz1g

7

Nếu bạn đặt các tùy chọn mặc định trên config/boot.rbthì tất cả các thuộc tính lệnh cho rake và rails không thành công (ví dụ: rake -Thoặc rails g model user)! Vì vậy, hãy nối đoạn mã này vào bin/railssau dòng require_relative '../config/boot'và mã chỉ được thực thi cho lệnh máy chủ 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

Các bin/railstập tin loks như thế này:

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

Đây là một giải pháp đơn giản hơn mà tôi đang sử dụng. Tôi đã thích / cần dotenvpuma-heroku , vì vậy nếu việc sử dụng chúng không phù hợp với bạn thì điều này có thể không dành cho bạn.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Bây giờ tôi có thể bắt đầu cả dev và production với rails s.



1

Nếu bạn sử dụng docker hoặc một công cụ khác để quản lý các biến môi trường, bạn có thể đặt HOSTbiến môi trường thành IP mà bạn cần liên kết.

Thí dụ: HOST=0.0.0.0

Thêm nó vào docker.envtệp nếu bạn sử dụng Docker hoặc .envnếu bạn sử dụng quản đốc.


0

Đối với Rails 5 với Puma, câu trả lời đã chọn không hoạt động. Bạn có thể gặp lỗi như vậy:cannot load such file -- rails/commands/server

Để có giải pháp thích hợp, hãy thêm phần sau vào config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.