【问题标题】:How to detect if a rails app is running under Unicorn?如何检测 Rails 应用程序是否在 Unicorn 下运行?
【发布时间】:2011-11-09 01:01:54
【问题描述】:

我需要在我的 Rails 应用程序中设置与外部服务的连接。我在初始化程序中执行此操作。问题是服务库使用线程交付(我需要它,因为我不能让它陷入请求),但是独角兽生命周期导致线程被杀死并且工作人员永远看不到它。一种解决方案是在每个请求上调用一个新连接,但这会造成不必要的浪费。

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

所以问题是,确定 Rails 应用程序是否在 Unicorn(主进程或工作进程)下运行的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails unicorn


    【解决方案1】:

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

    我的管理员中有一个模板,它通过 env 变量并吐出它的内容。

    独角兽 4.0.1

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

    rails 服务器 (webrick)

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

    【讨论】:

      【解决方案2】:

      您可以检查 defined?(Unicorn) 并在您的 Gemfile 集中:gem :unicorn, require: false 事实上,您不需要在 Rails 应用程序中加载 Unicorn 库。 服务器由 shell 中的unicorn 命令启动

      【讨论】:

        【解决方案3】:

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

        我已经以非常直接的方式解决了它:

        # `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
        

        干杯!

        【讨论】:

          【解决方案4】:

          您可以检查 Unicorn 模块是否已使用 Object.constants.include?('Unicorn') 定义。

          这当然是独角兽特有的。一种更通用的方法是使用一种方法来建立您的连接并记住它已经完成了。如果它被多次调用,它只会在后续调用中返回不做任何事情。然后在应用程序控制器的 after_fork 和 before_filter 中调用该方法。如果它已在 after_fork 中运行,则在 before_filter 中不执行任何操作,如果尚未运行,则在第一个请求中执行它的操作,并且在后续请求中不执行任何操作。

          【讨论】:

            【解决方案5】:

            内部config/unicorn.rb 将 ENV 变量定义为

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

            然后这个变量ENV['RAILS_STDOUT_LOG'] 将可以在您的Rails 应用程序工作线程中的任何位置访问。

            我的问题: 我想在 Unicorn 工作人员而不是 Heroku 上的任何其他工作人员上输出所有日志(SQL 查询),所以我所做的是在 unicorn 配置文件中添加 env 变量

            【讨论】:

              猜你喜欢
              • 2015-11-26
              • 1970-01-01
              • 1970-01-01
              • 2012-08-18
              • 1970-01-01
              • 2021-06-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-05
              相关资源
              最近更新 更多