在机架应用程序中,我如何知道哪个 Web 服务器正在作为机架处理程序运行?
例如,在 config.ru 中,我想打开是否正在运行 WEBrick:
unless running_webrick?
redirect_stdout_and_stderr_to_file
end
run App
def running_webrick?
???
end
传递给堆栈中每个组件的环境哈希都有一个SERVER_SOFTWARE
键。运行它并观察网页上的输出:
require 'rack'
class EnvPrinter
def call env
[200, {'content-type' => 'text/plain'}, [env.inspect]]
end
end
run EnvPrinter.new
如果使用 rackup 执行,webrick 将用作服务器(这是默认设置)并且SERVER_SOFTWARE
类似于WEBrick/1.3.1 (Ruby/1.9.3/2013-01-15)
. 如果使用独角兽,它将类似于Unicorn 4.5.0
. 此机架代码根据运行的服务器返回自定义响应:
require 'rack'
class EnvPrinter
def call env
response = case env.fetch('SERVER_SOFTWARE')
when /webrick/i then 'Running on webrick'
when /unicorn/i then 'Running on unicorn'
when /thin/i then 'Running on thin'
else "I don't recognize this server"
end
[200, {'content-type' => 'text/plain'}, [response]]
end
end
run EnvPrinter.new