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



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

基于James Hebden的回答:

添加Puma到gemfile

# Gemfile
gem 'puma'

Bundle install

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没有),您可以做一点hack来让rails服务器使用它们。在你的rails项目根目录下的scripts/rails文件中,你可以在' require 'rails/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。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现在将查看RACK_HANDLER环境变量文件,以查看您是否指定了默认的机架处理程序。如果使用的是dotenv,可以在.env文件中添加这样一行来设置默认值,或者从命令行指定分配值。

`RACK_HANDLER=webrick`

这应该工作作为这个拉请求:

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

我不会特别使用rails server命令。只要安装你想要的gem,并将命令(例如rails s Puma)别名为rs

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

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

据我所知,添加这些宝石中的任何一个都可以通过rails server

运行适当的服务器

显然这只适用于Thin或Puma。

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

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

如果您使用bash,请运行:export RACK_HANDLER=webrick

相关内容

  • 没有找到相关文章

最新更新