如何在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`
这应该适用于此拉取请求:
我不会专门使用rails server
命令。 只需安装你想要的任何gem,并将命令(例如rails s Puma
) rails 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