我是Rails的新手,我想知道是否有一個選項可以更改默認的rails服務器,即webrick,而不是另一個,比如'puma'或'thin'。我知道可以指定使用'rails server'命令運行哪個服務器,但是我想使用此命令而不指定服務器的名稱,以便它可以運行默認的rails服務器。有沒有辦法將默認的rails服務器更改爲配置文件或類似的東西?在此先感謝您的幫助!如何更改Rails 3中的默認導軌服務器?
回答
我認爲導軌只是傳遞給機架提供的服務器選項。機架有以下邏輯決定執行何種服務器:
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
方法進行猴子修補。當然這可能會在未來的機架版本中打破。
如果你想麒麟/薄/等,只需添加寶石到您的Gemfile
即gem 'unicorn'
,gem 'thin'
等然後運行bundle install
在命令行。
據我所知,無論是加入這些寶石的運行通過rails server
UPDATE
顯然,這隻能用於薄或彪馬適當的服務器。
當我添加寶石 '薄' 到它的工作原理,但對的Gemfile寶石'獨角獸'它不起作用,因爲當我運行命令軌服務器時,它啓動Webrick而不是獨角獸,因此我詢問是否有另一種選擇。謝謝。 – airin
@airin,從你的RAILS_ROOT運行unicorn_rails – sameera207
我不會掛在具體使用rails server
命令。只需安裝您想要的任何寶石,並將命令(例如rails s Puma
)別名爲rs
。
機架(導軌和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
應該要求'rails/commands',而不是'rack/commands'。無法編輯您的帖子,愚蠢的StackOverflow說:'編輯必須至少6個字符;在這篇文章中還有其他改進之處嗎?:) –
啊 - 感謝您發現錯字! –
基於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
(在Rails
3.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
爲了避免在沒有安裝美洲獅寶石時發生錯誤,您可以使用 'begin'包裝'Rack :: Handler :: WEBrick = Rack :: Handler.get(:puma)'' ... 'rescue LoadError ' 'end' –
重要提示(如上所述):在'require'rails/commands''上方插入行。感謝您的解決方案。 – Linus
如果您在你的G中有薄 emfile,您需要這樣做:
require 'rack/handler'
Rack::Handler::Thin = Rack::Handler.get(:puma)
雖然我沒有'瘦'在我的Gemfile中,並且確實有'puma',但它確實對我有用。儘管如此,在這次更改之前,Thin仍然作爲默認服務器啓動,並且Rack :: Handler :: WEBrick = Rack :: Handler.get(:puma)方法不起作用。我在Rails 4.2.6上。謝謝! –
機架現在將查看您的.env文件,以查看您是否指定了默認機架處理程序。您可以將這樣的一行添加到.env中以設置默認值。
RACK_HANDLER=webrick
這應該工作,因爲這拉請求:
什麼版本的機架適合這個? – rharriso
1.6.0+ https://github.com/rack/rack/blob/e4e4c397e89c026f9c23500cf7fc14ccdb756010/lib/rack/handler.rb#L56 – dwschrashun
爲我工作感謝,不希望美洲獅默認加載。 – abhishek77in
如果你使用bash運行:export RACK_HANDLER=webrick
- 1. 更改Rails的默認服務器
- 2. Rails 3 polymorphic_path - 如何更改默認route_key
- 3. rails服務器錯誤? (導軌3)
- 4. 在Ubuntu中更改默認導軌
- 5. 如何更改sql服務器中的默認列值
- 6. 如何在Rails 3中更改日期的默認格式?
- 7. 如何更改rails 3中表單的text_area默認大小?
- 8. 導軌3:默認排除結果
- 9. 重新啓動導軌服務器,脫離導軌服務器
- 10. 禁用導軌3默認路由
- 11. 運行rails服務器時出錯 - 如何更改rubygem環境的默認ruby?
- 12. 如何更改Rails 4.2開發服務器的默認綁定IP?
- 13. 如何更改全局編錄服務器的默認端口?
- 14. 導軌服務器問題(導軌4.1.1)
- 15. 如何更改默認導軌錯誤分區「field_with_errors」
- 16. Apache服務器默認pahe如何更改? (WINDOWS)
- 17. Rails更改默認URL的
- 18. 如何更改WCf服務的wsdl文件中的默認schemalocation?
- 19. 升級到導軌3後,'導軌服務器'仍然只顯示用法
- 20. 導軌服務器錯誤
- 21. 如何更改文件少3引導程序默認列數
- 22. Rails更改默認時區
- 23. Corda Demobench更改默認服務名稱
- 24. 更改咕嚕服務默認路徑
- 25. 加速軌道3開發服務器
- 26. 如何在天青網站服務中更改默認時區?
- 27. 與軌道導軌默認基
- 28. 如何使用Phusion Passenger Standalone作爲默認的Rails服務器
- 29. 如何更改SharePoint中表單庫的默認InfoPath表單服務器Url
- 30. 與導軌服務器
'pick'['thin','puma','webrick']'是怎麼回事? 'pick'似乎並不是標準庫的一部分(糾正我,如果我錯了),所以這段代碼有點超出了上下文。 –