Nailgun模式下JRuby 1.7上的Rails应用程序无法启动

时间:2013-01-08 11:10:36

标签: ruby-on-rails jruby nailgun

我在RVM中安装了JRuby 1.7.2,创建了一个gemset,执行了bundle install。现在,我运行这个:

第1学期:

[lzap@lzapx my_app]$ bundle exec jruby --ng-serv
NGServer started on all interfaces, port 2113.

第2学期:

[lzap@lzapx my_app]$ JRUBY_OPTS="--1.9 --ng" bundle exec rails s

问题是没有任何反应,双方都没有打印任何东西,它只是永远挂起。 Top不会显示任何java / jruby进程正在运行。

如果我尝试在没有-ng的情况下启动应用程序,它可以正常工作。有什么问题?捆绑?

当然禁用防火墙。

1 个答案:

答案 0 :(得分:1)

一个Nailgun服务器

可以为rails生成binstub ...

$ bundle binstubs rails

...并编辑它以设置JRUBY_OPTS。

ENV['JRUBY_OPTS'] = '--1.9 --ng --nailgun-port 2113'
load Gem.bin_path('rails', 'rails')

这样,只有客户端的bundler-wrapped部分才会在bundler-wrapped nailgun服务器中执行。

由于nailgun不会传播信号,您可能需要使用控制器来阻止它:

class RailsController < ApplicationController
  def stop
    Process.kill :INT, 0
  end
end

基准:

$ time bin/rails -v  # modified
Rails 3.0.11

real    0m3.737s
user    0m6.579s
sys     0m0.223s

$ time bin/rails -v  # unmodified
Rails 3.0.11

real    0m5.547s
user    0m12.739s
sys     0m0.411s

$ time bundle exec rails -v
Rails 3.0.11

real    0m9.145s
user    0m20.708s
sys     0m0.682s

两个Nailgun服务器

理论上可以使用第二个“非捆绑执行”服务器。为了避免显式重启但允许查杀(通过两次Ctrl-C按下)我建议这个循环:

$ while sleep 1; do jruby --ng-server 2112; done

必须在外部客户端中指定第二个nailgun实例的端口:

$ JRUBY_OPTS='--1.9 --ng --nailgun-port 2112' bin/rails s

我没有看到性能改进,并且“错误”控制台中出现的输出很烦人。但也许这在其他系统上更快。还有其他人可能会看到改进这种方法的方法吗?