Приложение Rails на JRuby 1.7 в режиме Nailgun не запускается

Я установил JRuby 1.7.2 в RVM, создал gemset, выполнил установку пакета. Теперь я запускаю это:

Термин 1:

[[email protected] my_app]$ bundle exec jruby --ng-serv
NGServer started on all interfaces, port 2113.

Термин 2:

[[email protected] my_app]$ JRUBY_OPTS="--1.9 --ng" bundle exec rails s

Проблема в том, что ничего не происходит, с обеих сторон терминалы ничего не печатают, она просто висит навсегда. В верхней части не отображаются процессы java/jruby.

Если я попытаюсь запустить приложение без -ng, все будет хорошо. В чем проблема? Bundler?

Конечно, межсетевой экран отключен.

Ответ 1

Один сервер Nailgun

Возможно генерировать binstub для рельсов...

$ bundle binstubs rails

... и отредактируйте его, чтобы установить JRUBY_OPTS.

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

Таким образом, только завернутая пакетом часть клиента выполняется на сервере nailgun-wrapped.

Так как nailgun не распространяет сигналы, вы можете использовать контроллер, чтобы остановить его:

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

Benchmark:

$ 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

Я не видел улучшения производительности, и вывод, появляющийся в "неправильной" консоли, раздражает. Но, возможно, это происходит быстрее в других системах. И кто-то другой может увидеть способ улучшить этот подход?