[英]How to change the default binding ip of Rails 4.2 development server?
將我們團隊的 rails 應用程序升級到 4.2 后,如發行說明所述,默認的 ip rails server
綁定到localhost
從0.0.0.0
更改為localhost
。
我們使用 Vagrant 進行開發,並希望可以直接從主機上的瀏覽器訪問開發服務器。
從現在開始,不再每次都輸入rails s -b 0.0.0.0
,我想知道是否有更優雅的解決方案,以便我們仍然可以像rails s
一樣簡單地啟動服務器。 也許:
rails s
讀取我可以修改默認綁定 ip 的位置(不使用-c
) 這背后的真正目標是我希望我們的團隊能夠順利進行升級,避免由於缺少-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 -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
文件看起來像這樣:
#!/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'
這是我正在使用的一個更簡單的解決方案。 我已經喜歡/需要dotenv和puma-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.