繁体   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