【问题标题】:How to detect what server (thin, puma, passenger, ...) is used for Rails application?如何检测用于 Rails 应用程序的服务器(瘦、彪马、乘客……)?
【发布时间】:2014-07-12 22:00:01
【问题描述】:

我需要根据用于启动应用程序的 Web 服务器执行某些初始化。是否可以通过 rails 初始化程序以编程方式检测到它?

【问题讨论】:

  • 为什么你需要知道,什么样的初始化取决于web服务器的类型?告诉我们更多关于您想要实现的目标,也许有更好的方法。对我来说听起来很奇怪,应用程序应该可以响应查找此类信息。我认为将这些信息传递给应用程序(例如通过 ENV)是一个更好的主意。
  • 是的,我知道这有点奇怪......而且我担心如果我详细介绍它会更奇怪。但是......有从我们的rails应用程序开始的子进程(我们使用selenium webdriver制作服务器端截图,运行firefox子进程)。问题是 Thin 不会在停止/重新启动时杀死这些进程,但 Passenger 会。所以我想仅在应用程序运行时手动关闭 firefox。虽然我还不知道如何捕捉“退出事件”,因为 at_exit 处理程序不会在重新启动时调用,仅在停止时调用。
  • 实际上,我需要一种有保证的方法来在 Rails 应用程序停止/重新启动时关闭它的所有子进程,而不取决于特定的 Web 服务器,但这可能是另一个问题。

标签: ruby-on-rails ruby


【解决方案1】:

虽然不是很干净,但你可以使用

defined?(::Thin) 
defined?(::Unicorn)
defined?(::Passanger)

等等。这将适用于这三个,你必须检查它是否适用于其他人。

【讨论】:

  • 不幸的是,这不是很可靠。我可以在 Gemfile 中包含薄 gem,但可以通过 nginx 中的乘客模块启动应用程序
  • 确实如此。让我们等待其他答案,如果有的话。
  • 查看这个关于NewRelic调度员stackoverflow.com/a/12246652/391826的答案
【解决方案2】:

这是一种 hacky 方法(在 config/application.rb 中添加):

module Rails
  class Server < ::Rack::Server
    alias_method :old_start, :start
    def start
      puts server.name # or set an ENV variable
      old_start
    end
  end
end

【讨论】:

  • 不幸的是,如果不是通过rails server 命令启动服务器,它就不起作用。在我的例子中,thin 是通过thin start 启动的,Passenger 是一个 nginx 模块。
【解决方案3】:

您可以使用ps aux检查进程是否正在运行

ps aux | grep passenger
ps aux | grep puma
ps aux | grep unicorm

【讨论】:

  • OP 询问了detect it programmatically from rails initializer,这意味着来自 Ruby 代码。现在您仍然可以运行系统命令,但仍然无法获得想要的结果
  • @CyrilDuchon-Doris 运行上述命令时我们不会得到什么期望的结果?
  • 虽然您可以将它们作为系统命令运行,但如果您打开了多个进程(即运行了多个乘客进程),这将无法帮助您检测 current 应用程序是否已运行是否使用网络服务器。
猜你喜欢
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多