簡體   English   中英

Rails 4.2開發服務器如何修改默認綁定ip?

[英]How to change the default binding ip of Rails 4.2 development server?

將我們團隊的 rails 應用程序升級到 4.2 后,如發行說明所述,默認的 ip rails server綁定到localhost0.0.0.0更改為localhost

我們使用 Vagrant 進行開發,並希望可以直接從主機上的瀏覽器訪問開發服務器。

從現在開始,不再每次都輸入rails s -b 0.0.0.0 ,我想知道是否有更優雅的解決方案,以便我們仍然可以像rails s一樣簡單地啟動服務器。 也許:

  • 配置文件rails s讀取我可以修改默認綁定 ip 的位置(不使用-c
  • 使用 vagrant 進行端口轉發(嘗試但失敗,請參閱下面遇到的問題)
  • 一個猴子補丁到機架,它改變了默認的綁定 ip

這背后的真正目標是我希望我們的團隊能夠順利進行升級,避免由於缺少-b 0.0.0.0部分而導致人們不得不不斷重啟他們的 rails 服務器的故障。

我嘗試了 vagrant 端口轉發,但是當我在主機上訪問localhost:3000時仍然Connection Refused 我嘗試的兩條配置行是:

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

在官方文檔中沒有找到任何相關說明。 任何幫助將不勝感激。

我在這里遇到了同樣的問題,我今天找到了一個更好的解決方案。 只需將此代碼附加到您的 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:它基於: 這個答案

您可以使用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 的壞處是你必須訓練你的團隊運行foreman start而不是rails s

遇到同樣的問題。 發現博客Make Rails 4.2 server listens to all interfaces

將以下內容添加到 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

對於帶有 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 ,因此可能還有其他方法可以做到,但這對我來說似乎是最合理的。

如果您將默認選項放在config/boot.rb則 rake 和 rails 的所有命令屬性都會失敗(例如: rake -Trails 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'

這是我正在使用的一個更簡單的解決方案。 我已經喜歡/需要dotenvpuma-heroku ,所以如果使用它們對您不起作用,那么這可能不適合您。

/配置/美洲獅.rb

plugin :heroku

文件

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

.env

PORT=8080

現在我可以使用rails s開始開發和生產。

如果使用docker或者其他工具管理環境變量,可以將HOST環境變量設置為需要綁定的IP。

示例: HOST=0.0.0.0

如果使用 Docker, .env其添加到docker.env文件中,如果使用.env則將其添加到docker.env文件中。

對於帶有 Puma 的 Rails 5,所選答案不起作用。 您可能會收到這樣的錯誤: cannot load such file -- rails/commands/server

要獲得正確的解決方案,請將以下內容添加到config/puma.rb

bind 'tcp://0.0.0.0:3000'

切換到Puma並在config/puma.rb指定port ,例如:

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

顯然它會綁定到指定端口的0.0.0.0:https://github.com/puma/puma/issues/896

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM