2013-01-03 83 views
9

我是Rails的新手,我想知道是否有一個選項可以更改默認的rails服務器,即webrick,而不是另一個,比如'puma'或'thin'。我知道可以指定使用'rails server'命令運行哪個服務器,但是我想使用此命令而不指定服務器的名稱,以便它可以運行默認的rails服務器。有沒有辦法將默認的rails服務器更改爲配置文件或類似的東西?在此先感謝您的幫助!如何更改Rails 3中的默認導軌服務器?

回答

5

我認爲導軌只是傳遞給機架提供的服務器選項。機架有以下邏輯決定執行何種服務器:

https://github.com/rack/rack/blob/master/lib/rack/server.rb#L271-L273

def server 
    @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default(options) 
end 

第一種情況是當:server選項傳遞給rails server命令。第二個是確定默認值。它看起來像:

https://github.com/rack/rack/blob/master/lib/rack/handler.rb#L46-L59

def self.default(options = {}) 
    # Guess. 
    if ENV.include?("PHP_FCGI_CHILDREN") 
    # We already speak FastCGI 
    options.delete :File 
    options.delete :Port 

    Rack::Handler::FastCGI 
    elsif ENV.include?("REQUEST_METHOD") 
    Rack::Handler::CGI 
    else 
    pick ['thin', 'puma', 'webrick'] 
    end 
end 

薄和彪馬應該是自動拾取。後備力量是Webrick。當然,其他網絡服務器可以重寫這種行爲,使其成爲鏈中的第一個。

如果您的Web服務器在默認情況下未被拾取,您可以按照需要對default方法進行猴子修補。當然這可能會在未來的機架版本中打破。

+0

'pick'['thin','puma','webrick']'是怎麼回事? 'pick'似乎並不是標準庫的一部分(糾正我,如果我錯了),所以這段代碼有點超出了上下文。 –

2

如果你想麒麟/薄/等,只需添加寶石到您的Gemfile

gem 'unicorn'gem 'thin'等然後運行bundle install在命令行。

據我所知,無論是加入這些寶石的運行通過rails server

UPDATE

顯然,這隻能用於薄或彪馬適當的服務器。

+0

當我添加寶石 '薄' 到它的工作原理,但對的Gemfile寶石'獨角獸'它不起作用,因爲當我運行命令軌服務器時,它啓動Webrick而不是獨角獸,因此我詢問是否有另一種選擇。謝謝。 – airin

+0

@airin,從你的RAILS_ROOT運行unicorn_rails – sameera207

2

我不會掛在具體使用rails server命令。只需安裝您想要的任何寶石,並將命令(例如rails s Puma)別名爲rs

8

機架(導軌和Web服務器之間的接口)具有用於默認WEBrick和Thin的處理程序。如果你把你的Gemfile在軌道根以下項目

gem 'thin' 

軌服務器會自動使用薄。自3.2rc2起就是這種情況。

這不幸的只適用於Thin,因爲Rack沒有內置的Unicorn支持等。

對於具有Rack處理程序的服務器(同樣,可悲的是,Unicorn不支持),您可以做一些黑客來讓rails服務器使用它們。在腳本/軌在軌項目的根文件,你可以添加以下略高於'要求「導軌/命令」

require 'rack/handler' 
Rack::Handler::WEBrick = Rack::Handler::<name of handler class> 

這實質上重置處理程序的WEBrick指向處理程序服務器你想使用。

要獲得支持的機架處理程序的理解,看看源代碼中的註釋:https://github.com/rkh/rack/blob/master/lib/rack/handler.rb

+2

應該要求'rails/commands',而不是'rack/commands'。無法編輯您的帖子,愚蠢的StackOverflow說:'編輯必須至少6個字符;在這篇文章中還有其他改進之處嗎?:) –

+0

啊 - 感謝您發現錯字! –

15

基於James Hebden的回答是:

添加Puma到Gemfile中

# Gemfile 
gem 'puma' 

捆綁安裝它

bundle 

設置成默認,這段代碼粘貼到script/rails以上require 'rails/commands'

require 'rack/handler' 
Rack::Handler::WEBrick = Rack::Handler.get(:puma) 

所以script/rails(在Rails3.2.12)看起來像:

#!/usr/bin/env ruby 
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 

APP_PATH = File.expand_path('../../config/application', __FILE__) 
require File.expand_path('../../config/boot', __FILE__) 
require 'rack/handler' 
Rack::Handler::WEBrick = Rack::Handler.get(:puma) 
require 'rails/commands' 

運行服務器

rails s 
=> Booting Puma 
+1

爲了避免在沒有安裝美洲獅寶石時發生錯誤,您可以使用 'begin'包裝'Rack :: Handler :: WEBrick = Rack :: Handler.get(:puma)'' ... 'rescue LoadError ' 'end' –

+0

重要提示(如上所述):在'require'rails/commands''上方插入行。感謝您的解決方案。 – Linus

2

如果您在你的G中有 emfile,您需要這樣做:

require 'rack/handler' 
Rack::Handler::Thin = Rack::Handler.get(:puma) 
+0

雖然我沒有'瘦'在我的Gemfile中,並且確實有'puma',但它確實對我有用。儘管如此,在這次更改之前,Thin仍然作爲默認服務器啓動,並且Rack :: Handler :: WEBrick = Rack :: Handler.get(:puma)方法不起作用。我在Rails 4.2.6上。謝謝! –

4

機架現在將查看您的.env文件,以查看您是否指定了默認機架處理程序。您可以將這樣的一行添加到.env中以設置默認值。

RACK_HANDLER=webrick 

這應該工作,因爲這拉請求:

https://github.com/rack/rack/pull/590

+0

什麼版本的機架適合這個? – rharriso

+0

1.6.0+ https://github.com/rack/rack/blob/e4e4c397e89c026f9c23500cf7fc14ccdb756010/lib/rack/handler.rb#L56 – dwschrashun

+0

爲我工作感謝,不希望美洲獅默認加載。 – abhishek77in

1

如果你使用bash運行:export RACK_HANDLER=webrick

相關問題