14

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

4

8 回答 8

22

根据James Hebden的回答:

添加Puma到宝石文件

# Gemfile
gem 'puma'

捆绑安装

bundle

将其设为默认值,将此代码粘贴到script/rails上面require 'rails/commands'

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

所以script/rails(in 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
于 2013-02-16T15:39:38.733 回答
9

Rack(Rails 和 Web 服务器之间的接口)具有默认 WEBrick 和 Thin 的处理程序。如果您将以下内容放在您Gemfile的 rails 项目的根目录中

gem 'thin'

rails server 会自动使用 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

于 2013-01-03T21:04:04.277 回答
6

我认为 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使其按您想要的方式工作。当然,这可能会在未来版本的机架中中断。

于 2013-01-03T20:43:01.657 回答
4

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

`RACK_HANDLER=webrick`

这应该在这个拉取请求中起作用:

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

于 2016-07-07T16:36:44.043 回答
2

如果你想要独角兽/瘦/等,只需将 gem 添加到你的 gemfile

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

据我所知,添加这些宝石中的任何一个都会通过以下方式运行相应的服务器rails server

更新

显然这仅适用于 Thin 或 Puma。

于 2013-01-03T20:34:20.290 回答
2

我不会挂断专门使用该rails server命令。只需安装您想要的任何 gem 并将命令(例如rails s Puma)别名为简单的rs.

于 2013-01-03T20:41:50.223 回答
2

如果您的 Gemfile 中有文件,则需要执行以下操作:

require 'rack/handler'
Rack::Handler::Thin = Rack::Handler.get(:puma)
于 2016-03-18T09:09:42.637 回答
1

如果你使用 bash 运行:export RACK_HANDLER=webrick

于 2016-09-04T08:25:01.393 回答