簡體   English   中英

如何在Rails 3中更改默認的rails服務器?

[英]How to change the default rails server in Rails 3?

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

基於James Hebden的回答:

Puma添加到gemfile

# Gemfile
gem 'puma'

捆綁安裝它

bundle

將其設為默認值,將此代碼粘貼到require 'rails/commands' script/rails上:

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

Rack(rails和web服務器之間的接口)具有默認WEBrick和Thin的處理程序。 如果將以下內容放在rails項目根目錄中的Gemfile

gem 'thin'

rails服務器會自動使用Thin。 自3.2rc2以來就是如此。

遺憾的是,這僅適用於Thin,因為Rack沒有內置支持Unicorn等。

對於擁有Rack處理程序的服務器(再次,可悲的是Unicorn沒有),你可以做一些破解讓rails服務器使用它們。 在rails項目根目錄的scripts / rails文件中,您可以在`require'trail / commands'上面添加以下內容

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

這實質上將WEBrick的處理程序重置為指向您要使用的服務器的處理程序。

要了解支持的Rack處理程序,請查看源代碼中的注釋: https//github.com/rkh/rack/blob/master/lib/rack/handler.rb

我認為rails只是傳遞給提供給機架的服務器選項。 Rack具有以下邏輯來確定要運行的服務器:

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

應該自動拾取Thin和Puma。 后退是Webrick。 當然,其他Web服務器可以覆蓋此行為,使其成為鏈中的第一個。

如果默認情況下沒有選擇您的Web服務器,您可以修改default方法以使其工作。 當然,這可能會在未來版本的機架中出現問題。

Rack現在將查看RACK_HANDLER環境變量文件,以查看您是否指定了默認的機架處理程序。 如果您使用的是dotenv,則可以將這樣的行添加到.env文件中以設置默認值,或者從命令行指定賦值。

`RACK_HANDLER=webrick`

這應該適用於此拉取請求:

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

如果你想要unicorn / thin / etc,只需將gem添加到你的gemfile中

gem 'unicorn'gem 'thin'等,然后在命令行運行bundle install

據我所知,添加這些寶石中的任何一個都可以通過rails server運行相應的rails server

UPDATE

顯然這僅適用於Thin或Puma。

我不會專門使用rails server命令。 只需安裝你想要的任何寶石,並將命令(例如rails s Puma )別名為rs簡單東西。

如果你的Gemfile中有 ,你需要這樣做:

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

如果你使用bash run: export RACK_HANDLER=webrick

暫無
暫無

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

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