0

我有一个在瘦服务器上运行的 Rails 3.2 应用程序,在 application.rb 中我想启动 EventMachine:

# application.rb

config.after_initialize do
  if ENV['EM']
    EM.run do
      host = '0.0.0.0'
      port = 3001

      # hit Ctrl + C to stop
      Signal.trap("INT")  { EventMachine.stop }
      Signal.trap("TERM") { EventMachine.stop }

      EventMachine::start_server host, port, SomeModule

      puts "EventMachine running on #{host}:#{port}. Ctrl + C to stop."
    end
  end
end

SomeModule 的代码依赖于正在加载的 Rails。这就是为什么我把它放在 after_initialize 块而不是初始化器中。

现在,当我启动服务器(使用rails s)时,我的输出看起来很好:

=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
EventMachine running on 0.0.0.0:3001. Ctrl + C to stop.

但是当我在浏览器中访问 localhost 时,我得到了204 No Content响应。

我可以想到导致这种情况的几件事,但不是解决方案:)

  • 也许我在阻止 Rails 应用程序的同一线程上启动 EventMachine。但是 Thin 应该处理好这个问题吗?
  • 也许我应该以不同的方式启动我的服务器,但那怎么办?
4

2 回答 2

3

再谷歌搜索后,我发现由于我使用的是 Thin,我不需要运行另一个 EventMachine。

我的 after_initialize 块现在看起来像这样:

config.after_initialize do
  include SomeModule
end

在 SomeModule 中,我将代码包装在一个EM.next_tick块中,否则我会收到“未初始化的事件机器:evma_connect_to_server (RuntimeError)”错误。

在带有 Thin 的 Rails 应用程序中使用 EventMachine 比我想象的要容易得多:)

于 2013-05-19T16:36:27.317 回答
0

您应该防止自动加载调用 EventMachine 的 ruby​​ 代码,否则它将阻塞您的主线程。将您的脚本放入 lib/daemons,然后为您的 EventMachine 创建一个启动脚本并将其用作守护程序。IE:

#!/usr/bin/env ruby
# this is: ./scripts/my_daemon

require 'daemons'

options = {
  multiple: false,
  backtrace: true,
  app_name: 'my_daemon',
  dir_mode: :normal,
  dir: '/tmp/my_daemon',
  log_dir: '/tmp/my_daemon',
  log_output: true,
  ARGV: ARGV,
}

system "mkdir -p /tmp/my_daemons"
Daemons.run(File.join(File.dirname(__FILE__), '../lib/daemons/my_daemon.rb'), options)

您需要将“守护进程”gem 添加到您的 Gemfile。

然后script/my_daemon start从 rails root 运行。还有更多命令:

  • script/my_daemon stop # 停止守护进程
  • script/my_daemon run # 在前台运行,所以你可以看到输出并调试它
  • script/my_daemon status # 显示是否有任何东西正在运行

你会发现登录/tmp/my_daemons/my_daemon.output

在此处查找有关守护程序的更多信息:http: //daemons.rubyforge.org/Daemons.html

于 2013-05-19T16:36:23.500 回答