我是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