ちょっと前に JRuby 9.0.0.0 がリリースされていました。Ruby 2.2 との互換性があるようです。
JRuby を使うと Azure Web Apps でも Ruby on Rails アプリを CRuby な環境よりも安定して動かすことができるので、これまでにも何回か扱ってきました。
そして偶然にも Web Apps もポータル周りがアップデートされて Java 8 を簡単に使うことができるようになったので、前のように JRuby 9.0.0.0 と Java 8 の組み合わせを Web Apps で動かしてみます。
最近のアップデートでポータルから Java のバージョンと Web コンテナの種類も設定可能になりました。
これまでは JAVA_HOME
を自分でオーバーライドする必要がありましたが、これからはポータルから必要な Java バージョンに切り替えるだけです。
Web コンテナを必ず指定しないといけないのはいまいちなので、使わない設定が欲しいですね。
Web Apps で動かすためのサンプルを以前に GitHub で公開しましたので、今回はそれを修正して JRuby 9.0.0.0 への対応を行いました。Java 8 はポータルからの設定だけで問題ありません。
主な修正点としては JRuby のバージョン指定とパスを修正したぐらいです。
以前は bundle exec
を使って実行していたのですが、JRuby の Wiki を見ていると bundle exec と同じことを行ってくれる -G オプションを知ったので、こちらを使うように Procfile を修正しました。
bundle exec
Improving startup time · jruby/jruby Wiki · GitHub
Bundler's "exec" command causes a second JRuby instance to be launched for the sole purpose of booting only your Gemfile gems. You can avoid the second process by passing -G to JRuby, which will do the Bundler pre-booting before starting JRuby and loading RubyGems.
PATH の問題なのか puma を相対パスで指定する必要があったので、その対応だけ行いました。
jruby.exe -G vendor/bundle/bin/puma --env development -p %PORT%
これまでは bundle exec の実行のために JRuby を起動した後、さらに JRuby が起動される形だったため起動パフォーマンスとメモリ消費が激しかったのですが、これで多少改善できました。
やはり初回起動には時間がかかりますが、実際にブラウザでアクセスすると Rails のいつものページが表示されます。ちゃんと JRuby 上で Ruby on Rails が動作することも確認できました。
相変わらずの話になりますが、JRuby をインストールするプロセスに地味に時間がかかるので、プリインストールされるようになればいいなと思います。
実行後に Process Explorer を見てみると、JRuby が 1 つだけ動いていることが確認できます。
JRuby が 1 つだけ起動するようになったので、起動時間も 20 秒ほど短縮できたと思います。
かなり JRuby 9.0.0.0 で互換性が改善されたらしく、Web Apps 上でも実用出来そうな気がしています。