Приложение Rails на JRuby 1.7 в режиме Nailgun не запускается
Я установил JRuby 1.7.2 в RVM, создал набор гемов, выполнил установку комплекта. Теперь я запускаю это:
Срок 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
Вопрос в том, что ничего не происходит, с обеих сторон терминалы ничего не печатают, просто висит навсегда. В верхней части не показаны работающие процессы java/jruby.
Если я пытаюсь запустить приложение без --ng, оно работает нормально. В чем проблема? Bundler?
Брандмауэр отключен, конечно.
1 ответ
Один гвоздодер
Можно создать binstub для рельсов...
$ bundle binstubs rails
... и отредактируйте его, чтобы установить JRUBY_OPTS.
ENV['JRUBY_OPTS'] = '--1.9 --ng --nailgun-port 2113'
load Gem.bin_path('rails', 'rails')
Таким образом, на клиентском сервере манипулятора выполняется только часть клиента, упакованная в пакет.
Так как гвоздодер не распространяет сигналы, вы можете использовать контроллер, чтобы остановить его:
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
Два сервера с гвоздями
Второй "неисполненный пакет" сервер может быть использован в теории. Чтобы избежать явных перезапусков, но разрешить уничтожение (двумя нажатиями Ctrl-C), я бы предложил этот цикл:
$ while sleep 1; do jruby --ng-server 2112; done
Порт для второго экземпляра ногтевого пистолета должен быть указан во внешнем клиенте:
$ JRUBY_OPTS='--1.9 --ng --nailgun-port 2112' bin/rails s
Я не видел улучшения производительности, и вывод, появляющийся в "неправильной" консоли, раздражает. Но, возможно, это быстрее в других системах. И кто-то еще может увидеть способ улучшить этот подход?