2011-11-09 49 views
4

我需要在我的Rails应用程序中建立到外部服务的连接。我在初始化器中这样做。问题是服务库使用线程交付(我需要,因为我不能让它陷入请求),但独角兽的生命周期导致线程被杀死,工作人员从未看到它。一种解决方案是对每个请求调用一个新的连接,但这是不必要的浪费。如何检测导轨应用程序是否在Unicorn下运行?

的最佳解决方案是设置向上在独角兽配置在after_fork块的连接。这个问题不会在独角兽之外被调用,这意味着我们无法在开发/测试环境中对其进行测试。

所以现在的问题是,什么是决定一个Rails应用程序是否麒麟(主或工作进程)下运行的最佳方式?

回答

0

你可以检查,看看是否独角兽模块已经与Object.constants.include?('Unicorn')定义。

这是非常具体的独角兽,当然。更一般的方法是建立一个连接并记住它已经完成的方法。如果被多次调用,它只会在随后的调用中不做任何事情。然后在应用程序控制器中的after_fork和before_filter中调用该方法。如果它已经在after_fork中运行,那么它在before_filter中没有执行任何操作,如果它尚未运行,它会在第一个请求中执行它,而在后续请求中则不执行任何操作。

3

有一个环境变量,在铁轨(我知道它的存在在3.0和3.1)访问,检查env['SERVER_SOFTWARE']值。你可以将一个正则表达式或字符串与该值进行比较来确定你正在运行的服务器。

我在管理一个模板,通过环境变量去和吐出它的内容。

独角兽4.0.1

env['SERVER_SOFTWARE'] => "Unicorn 4.0.1" 

轨服务器(使用WEBrick)

env['SERVER_SOFTWARE'] => "WEBrick/1.3.1 (Ruby/1.9.3/2011-10-30)" 
3

您可以检查defined?(Unicorn),并在您的Gemfile设置:gem :unicorn, require: false 其实你不需要在你的rails应用程序中加载Unicorn库。 服务器由unicorn命令从外壳

0

内启动config/unicorn.rb 定义ENV变量

ENV['RAILS_STDOUT_LOG']='1' worker_processes 3 timeout 90

,然后这个变量ENV['RAILS_STDOUT_LOG']会在你的Rails应用程序的工作线程任何地方访问。

我的问题: 我想输出所有的日志(SQL查询)当独角兽工人,而不是在Heroku上任何其他工人,所以我所做的就是麒麟配置文件中加入环境变量

1

检查Unicorn常数似乎是一个很好的解决方案,但是它很大程度上取决于Gemfile是否提供require: false。如果不是(这很可能),检查可能会产生误报。

我已经解决了它在一个非常直接的方式:

# `config/unicorn.rb` (or alike): 
ENV["UNICORN"] = 1 

... 

# `config/environments/development.rb` (or alike): 
... 
# Log to stdout if Web server is Unicorn. 
if ENV["UNICORN"].to_i > 0 
    config.logger = Logger.new(STDOUT) 
end 

干杯!

相关问题