如何在Rails 3中更改默认的rails服务器?

我是Rails的新手,我想知道是否有一个选项可以更改默认的rails服务器,即webrick,用于另一个例如’puma’或’thin’。 我知道可以使用’rails server’命令指定运行哪个服务器,但是我想使用此命令而不指定服务器的名称,以便它可以运行默认的rails服务器。 有没有办法将默认的rails服务器更改为配置文件或类似的东西? 在此先感谢您的帮助!

我认为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方法以使其工作。 当然,这可能会在未来的机架版本中出现问题。

基于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:: 

这实质上将WEBrick的处理程序重置为指向您要使用的服务器的处理程序。

要了解支持的Rack处理程序,请查看源代码中的注释: https : //github.com/rkh/rack/blob/master/lib/rack/handler.rb

Rack现在将查看RACK_HANDLER环境变量文件,以查看您是否指定了默认的机架处理程序。 如果您使用的是dotenv,则可以将这样的行添加到.env文件中以设置默认值,或者从命令行指定赋值。

 `RACK_HANDLER=webrick` 

这应该适用于此拉取请求:

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

我不会专门使用rails server命令。 只需安装你想要的任何gem,并将命令(例如rails s Pumarails s Puma为像rs这样简单的东西。

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

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

据我所知,添加这些gem中的任何一个都可以通过rails server运行相应的rails server

UPDATE

显然这仅适用于Thin或Puma。

如果你的Gemfile中有 ,你需要这样做:

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

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