我是 Rails 的新手,我想知道是否有一个选项可以将默认的 Rails 服务器(即 webrick)更改为另一个,例如“puma”或“thin”。我知道可以使用“rails server”命令指定要运行的服务器,但是我想在不指定服务器名称的情况下使用此命令,以便它可以运行默认的 rails 服务器。有没有办法将默认的 Rails 服务器更改为配置文件或类似的东西?在此先感谢您的帮助!
8 回答
根据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
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
我认为 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`
这应该在这个拉取请求中起作用:
如果你想要独角兽/瘦/等,只需将 gem 添加到你的 gemfile
即gem 'unicorn'
,gem 'thin'
等然后bundle install
在命令行运行。
据我所知,添加这些宝石中的任何一个都会通过以下方式运行相应的服务器rails server
更新
显然这仅适用于 Thin 或 Puma。
我不会挂断专门使用该rails server
命令。只需安装您想要的任何 gem 并将命令(例如rails s Puma
)别名为简单的rs
.
如果您的 Gemfile 中有薄文件,则需要执行以下操作:
require 'rack/handler'
Rack::Handler::Thin = Rack::Handler.get(:puma)
如果你使用 bash 运行:export RACK_HANDLER=webrick