JRubyを使用してApache Tomcat 7およびUbuntu 14.04でRailsアプリケーションを実行する方法

前書き

Ruby on Rails(RoR)は非常に人気のあるフレームワークであり、開発者は最新のデザインパターンに準拠したWebアプリケーションをすばやく作成できます。 ほんの数個のコマンドでRailsを使用すると、コードをまったく作成することなく、本番対応のバニラCRUD(作成、読み取り、更新、削除)アプリケーションを構築できます。 Apache Phusion Passenger、Unicorn、およびPumaは、Railsアプリケーションの実行に使用される一般的なサーバーの一部です。

Ruby MRIのパフォーマンスは、長年にわたって大幅に改善されました。 ただし、JavaやCなどの言語と比較すると、まだ遅いです。 クリティカル、同時、分散、およびエンタープライズグレードのアプリケーションに必要な書き込み時間の短縮に関心がある場合は、代わりにRubyのJava実装である* JRuby *を使用する必要があります。

Ruby MRIに対するJRubyの利点

同時実行-Ruby MRIはGIL(Global Interpreter Lock)を使用するため、同時実行が制限されます。 一方、JRubyはJVMのスレッドを使用できるため、より高いレベルの同時実行を実現できます。 これは通常、JRubyが他のRubieよりも選ばれる最も重要な理由です。

スレッドセーフ-Rubyのコアクラスのほとんどはスレッドセーフではありません。 マルチスレッドアプリケーションでこのようなクラスを使用すると、エラーが発生しやすくなります。 JRubyは、並列処理用に設計されたJavaのクラスを代わりに使用できます。

その他のライブラリ-JRubyを使用すると、Ruby gemのレパートリーだけでなく、すべてのJavaおよびScalaライブラリも自由に使用できます。 これにより、アプリケーションのコア機能にさらに集中できます。

展開の容易さ-JRuby on Railsアプリケーションは、単一のWARファイルにパッケージ化でき、任意のJava EEサーバーに簡単に展開できます。 それらの多くは、アプリケーションを管理するためのブラウザベースのインターフェースさえ持っています。

このチュートリアルの対象

このチュートリアルでは、次のことを学びます。

  • Rails(Ruby MRIを使用するもの)で簡単なCRUDアプリケーションを作成します

  • Ruby on RailsアプリケーションをJRuby on Railsアプリケーションに変換します

  • アプリケーションのWARファイルを生成します

  • Apache Tomcat 7をインストールする

  • TomcatサーバーにWARファイルをデプロイします

チュートリアルの最後に、実用的なJRuby on Railsアプリケーションがデプロイされます。

前提条件

  • * 32ビットUbuntu 14.04 *ドロップレットを展開します。 TomcatとJRubyは64ビットサーバーで実行されますが、おそらくより遅くなります。

  • sudoユーザーを作成します。

  • ドロップレットのRAMが2 GB未満の場合、少なくとも1 GBのスワップスペースを追加する必要があります。 詳細については、次のチュートリアルを参照してください。https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04 [Ubuntu 14.04でスワップを追加する方法]。

  • マシンにRVMの最新バージョンをインストールします。 次のチュートリアルのステップ1を参照してください:https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-ubuntu-12-04-lts-precise-pangolin-with -rvm#step-one%E2%80%94-install-ruby-with-rvm [RVMを使用してUbuntu 12.04 LTS(正確なPangolin)にRuby on Railsをインストールする方法]。 RVMをインストールする前に、キーを追加する必要がある場合があります。

gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3

コマンドでそのチュートリアルに従ってください。

手順1-簡単なCRUD RoRアプリケーションを作成する

RVMを初期化します。 この初期化は、新しいターミナルを開くたびに必要です。

. ~/.rvm/scripts/rvm

_ :Ruby 1.9.3を使用するRailsアプリケーションが既にある場合は、ステップ2にスキップできます。 _

すべてのRailsアプリケーションを格納するディレクトリを作成し、そのディレクトリを入力します。

mkdir ~/my_applications
cd ~/my_applications

このチュートリアルでは、Ruby 1.9.3を使用します。これは、JRubyがサポートするRubyの最新バージョンであるためです。

rvm install 1.9.3
rvm use 1.9.3

Railsをインストールします。

gem install rails -N
  • simple *という新しいRailsアプリケーションを作成します。

rails new simple

アプリケーションのディレクトリを入力します。

cd ~/my_applications/simple
  • nano *を使用して、gem * therubyracer *の行を編集およびコメント解除します。 RailsアプリケーションにはJavaScriptランタイムが必要なので、このgemを追加する必要があります。

nano ~/my_applications/simple/Gemfile

コメントを無視すると、更新されたファイルは次のようになります。

source 'https://rubygems.org'

gem 'rails', '4.1.7'
gem 'sqlite3'
gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'

gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'spring',        group: :development

最終的にRubyではなくJRubyを使用するため、コメントされた `+ therubyracer `行の `、platforms::ruby +`部分を削除する必要があります。

にリストされているすべてのgemをインストールします。

bundle install

Railsの足場機能を使用して、アプリケーションにいくつかのページを追加します。

rails g scaffold Employee name:string age:integer address:text

`+ rails g scaffold +`コマンドはいくつかの移行を生成します。 それらを適用します。

rake db:migrate

アプリケーションのルートを変更して、すべての従業員のリストを表示します。 * nano *を使用して `+〜/ my_applications / simple / config / routes.rb +`を編集し、その内容をコメントを除いて以下に示すものに変更します。

Rails.application.routes.draw do
 resources :employees

end

Ruby MRIを使用するRailsアプリケーションの準備ができました。 次を入力して、開発サーバーで実行します。

rails s

これには、起動に1〜2分かかります。

  • http:// <server-IP>:3000 *にアクセスすると、ブラウザでアプリケーションにアクセスできます。 いくつかのレコードを作成して、すべてが期待どおりに機能することを確認します。

image:http://i.imgur.com/dTBCir9.png [Ruby MRI WEBrickサーバーで実行中のアプリケーション]

コンソールに戻り、* Ctrl + C *を押してサーバーを停止します。

ステップ2-Java 8のインストール

JRubyをインストールして使用するには、JDKが必要です。 Oracle JDK 8は、 + webupd8team / java PPAを追加した後にインストールできます。

次を入力して、リポジトリを追加します。

sudo add-apt-repository ppa:webupd8team/java
  • Enter *を押して、新しいリポジトリを受け入れます。

のパッケージインデックスファイルを更新します。

sudo apt-get update

Oracle JDK 8をインストールします。

sudo apt-get install oracle-java8-installer

:実際のインストールを開始する前に、ライセンス契約に同意するよう求められます。

image:http://i.imgur.com/UpKz5IL.png [オラクルのライセンス契約ページ]

  • <Ok> を選択して Enter を押し、次に <Yes> を選択して Enter *を押します。

インストールが完了したら、次のコマンドを実行します。

java -version

次の出力が表示されるはずです。これは、Javaが正しくインストールされたことを意味します。

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) Client VM (build 25.25-b02, mixed mode)

ステップ3-JRubyおよびJRuby on Railsのインストール

RVMを使用して、JRubyをインストールして使用します。

rvm install jruby
rvm use jruby

JRubyの最新バージョン(2014年11月の時点で1.7.16.1)を使用する準備ができました。 バージョンを確認します。

jruby -v

これは、サーバーがOracle JDK 8を使用していることを示しています。 次のような出力が表示されます。

jruby 1.7.16.1 (1.9.3p392) 2014-10-28 4e93f31 on Java HotSpot(TM) Client VM 1.8.0_25-b17 +jit [linux-i386]

JRuby on Railsをインストールします。

gem install rails -N

JRuby on Railsがインストールされました。

ステップ4-JRubyを使用するためのアプリケーションの構成

多くのRuby MRI gemがJRubyによってシームレスにサポートされていますが、ネイティブコードを持つ一部のgemはそうではありません。 データベースへのインターフェイスであるほとんどの宝石は、このカテゴリに分類されます。 現在、アプリケーションでは* sqlite3 * gemを使用していますが、これはJRubyではサポートされていません。 代わりに* activerecord-jdbcsqlite3-adapter *を使用する必要があります。

同様に、JRubyは* therubyracer * gemの代わりに* therubyrhino *をJavaScriptエンジンとして使用します。

  • nano *を使用して `+〜/ my_applications / simple / Gemfile +`を編集し、この変更を行います。

nano ~/my_applications/simple/Gemfile

コメントを除いた2行を更新すると、ファイルは次のようになります。

source 'https://rubygems.org'

gem 'rails', '4.1.7'
gem
gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'spring',        group: :development

これまで行ったことがない場合は、行から `+ platform`設定を削除する必要があります。

一部のgemにはネイティブ拡張が必要です。 以下を入力して、JRubyがC拡張をサポートできるようにします。

echo "cext.enabled=true" >> ~/.jrubyrc

これで、新しく追加されたgemをインストールできます。

bundle install

SQLite3をデータベースとして使用していない場合は、次のgemのいずれかが必要になる場合があります。

  • Derbyの場合:* activerecord-jdbcderby-adapter *

  • MySQLの場合:* activerecord-jdbcmysql-adapter *

  • Postgresの場合:* activerecord-jdbcpostgresql-adapter *

ステップ5-Javaポリシーファイルの更新

ブラウザを使用して、http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html [JCE Unlimited Strength Jurisdiction policy files]をダウンロードします。 最初にOracleのライセンス契約に同意する必要があります。

(契約に同意する必要があるため、ファイルを作成できません。)

ローカルコンピューター*で、 scp *を使用してサーバーにファイルをアップロードします。

scp jce_policy-8.zip @:~
  • server *で、unzipユーティリティをインストールします。

sudo apt-get install unzip

のディレクトリでファイルを解凍します。

cd /tmp
unzip ~/jce_policy-8.zip

ポリシーファイルをJREのディレクトリにコピーします。

cd /tmp/UnlimitedJCEPolicyJDK8
sudo cp *.jar /usr/lib/jvm/java-8-oracle/jre/lib/security/

アプリケーションのディレクトリに戻ります。

cd ~/my_applications/simple

次のコマンドを実行して、JVMの起動を高速化します。 これは、仮想サーバー環境が独自にランダム性をほとんど生成しない傾向があるために必要です。

export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

この時点で、RailsアプリケーションはJRubyを使用するように完全に構​​成されています。 開発サーバーを起動します。

rails s

このサーバーの起動には数秒かかる場合があります。 続行する前に、次の出力が表示されるまで待ちます。

=> Booting WEBrick
=> Rails 4.1.7 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-11-06 04:38:15] INFO  WEBrick 1.3.1
[2014-11-06 04:38:15] INFO  ruby 1.9.3 (2014-09-25) [java]
[2014-11-06 04:38:15] INFO  WEBrick::HTTPServer#start: pid=2620 port=3000

ブラウザを使用して* http:// <server-ip>:3000 *にアクセスし、アプリケーションをテストします。 現在、Ruby MRIを使用する代わりにJVM上で実行されているという事実を除いて、アプリケーションについて何も違いはありません。

ターミナルに戻り、* Ctrl + C *を押してサーバーを停止します。

手順6-アプリケーションをデプロイ可能なWARファイルとしてパッケージ化する

TomcatのようなサーブレットコンテナでJRuby on Railsアプリケーションを実行するには、まずWAR(WebアプリケーションARchive)ファイルにパッケージ化する必要があります。 これは、* warbler * gemを使用して実行できます。

  • warbler *をインストールします。

gem install warbler

アプリケーションが使用するSQLiteデータベースは現在、アプリケーションのディレクトリにあります。 WARファイルが生成されると、現在の状態のデータベースはWARファイル内に配置されます。 アプリケーションが再デプロイされると、デプロイメント後にデータベースに加えられた変更は上書きされるため、これは望ましくありません。

したがって、SQLiteデータベースファイルは、アプリケーションのディレクトリ外の場所に移動する必要があります。

データベース用の新しいディレクトリを作成します。

mkdir -p ~/databases/simple

このチュートリアルでは、開発データベースのみを考慮します。 したがって、開発データベースファイルを新しく作成したディレクトリに移動します。

mv ~/my_applications/simple/db/development.sqlite3 ~/databases/simple
  • nano *を使用してファイルを編集します。

nano ~/my_applications/simple/config/database.yml

開発データベースのパスを更新します。 このチュートリアルでは必要ないため、他の環境の詳細を削除することもできます。 変更後、ファイルは次のようになります。

default: &default
 adapter: sqlite3
 pool: 5
 timeout: 5000

development:
 <<: *default
 database:

ワーブラーは、WARのRails環境を知る必要もあります。 このチュートリアルでは、環境にこだわります。 これは、 `+ config / warble.rb +`ファイルを使用して指定されます。

  • nano *を使用して、という名前の新しいファイルを作成します

nano ~/my_applications/simple/config/warble.rb

ファイルに次を追加します。

Warbler::Config.new do |config|
 config.webxml.rails.env =
end

これで、アプリケーションをWARファイルにパッケージ化する準備が整いました。 次のコマンドを実行して、ファイルを生成します。

warble executable war

これには少し時間がかかります。

成功した出力は次のようになります。

Downloading winstone-0.9.10-jenkins-43.jar
rm -f simple.war
Creating simple.war

この時点で、アプリケーションのディレクトリに名前の付いたファイルが作成されます。 引数をコマンドに追加すると、小さな組み込みサーバー(Winstoneと呼ばれる)が含まれるWARファイルが生成されます。 このファイルは、次のように(外部サーバーなしで)個別に使用できます。

java -jar simple.war

これは、WARファイルの問題をチェックするのに適した方法です。 ブラウザを使用して* http:// <server-ip>:8080 *にアクセスできるようになりました。 数分後、アプリケーションが正常に動作することを確認できるはずです。 データベースアプリケーションで以前に作成したすべてのエントリがここに表示されます。

サーバーが起動したことを知らせるために、次のような出力が表示されるまで待つ必要があります。

Nov 13, 2014 12:24:37 PM winstone.Logger logInternal
INFO: Started GET "/assets/application.js?body=1" for 108.29.37.206 at 2014-11-13 12:24:37 -0500

ターミナルに戻り、* Ctrl + C *を押して組み込みサーバーを停止します。

アプリケーションがWARとして機能していることを確認したら、次のコマンドを使用してTomcatの新しいWARを生成します。

warble war

古い実行可能WARが、組み込みサーバーのない新しいWARファイルに置き換えられます。

手順7-Tomcatのインストールと起動

Tomcatの最新バージョンをダウンロードします。

cd ~
wget http://mirror.cc.columbia.edu/pub/software/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz

Tomcat用の新しいディレクトリを作成し、そのディレクトリに入ります。

mkdir ~/Tomcat
cd ~/Tomcat

アーカイブを抽出します。

tar -xvzf ~/apache-tomcat-7.0.56.tar.gz

`+ java.lang.OutOfMemoryError +`を回避するために、Tomcatで使用可能な最大ヒープサイズを* 512m *に設定します。 このエクスポートは、Tomcatサーバーを起動するたびに実行する必要があります。

export CATALINA_OPTS="-Xmx512m"

前と同じように、ランダム生成を設定します。

export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

Tomcatを起動します。

~/Tomcat/apache-tomcat-7.0.56/bin/catalina.sh start

このサーバーも起動に数秒かかります。 ログを監視するには、次を入力します。

tail -f ~/Tomcat/apache-tomcat-7.0.56/logs/catalina.out

サーバーの準備が完了すると、次のようなログメッセージが表示されます。

Nov 10, 2014 4:12:32 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory ~/Tomcat/apache-tomcat-7.0.56/webapps/manager has finished in 210 ms
Nov 10, 2014 4:12:32 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Nov 10, 2014 4:12:32 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Nov 10, 2014 4:12:32 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3390 ms
  • Ctrl + C *を押してコマンドを終了します。

Tomcatがインストールされ、実行されています。 ブラウザを使用して* http:// <server-ip>:8080 *にアクセスできます。 Tomcatのウェルカムページが表示されるはずです。

image:http://i.imgur.com/AStL4HY.png [Apache Tomcatウェルカムページ]

ステップ8-アプリケーションをTomcatにデプロイする

TomcatにWARをデプロイするには、Tomcatのフォルダーにコピーするだけです。

cp ~/my_applications/simple/simple.war ~/Tomcat/apache-tomcat-7.0.56/webapps

アプリケーションが自動的にデプロイされるまで1分程度かかる場合があります。 待っている間、Tomcatのログファイルの内容を監視できます:

tail -f ~/Tomcat/apache-tomcat-7.0.56/logs/catalina.out

アプリケーションを使用する準備が整うと、次のようなログメッセージが表示されます。

INFO: Deploying web application archive ~/Tomcat/apache-tomcat-7.0.56/webapps/simple.war
Oct 30, 2014 4:42:35 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deployment of web application archive ~/Tomcat/apache-tomcat-7.0.56/webapps/simple.war has finished in 47,131 ms
  • Ctrl + C *を押して、 `+ tail +`コマンドを終了します。

ブラウザを使用して* http:// <server-ip>:8080 / simple / *にアクセスし、Tomcat上で実行されているJRuby on Railsアプリケーションを確認できるようになりました。

セッションを再開する

SSHセッションからいつでも切断する場合は、次の3つのコマンドを実行する必要があります。

cd ~/my_applications/simple
. ~/.rvm/scripts/rvm
rvm use jruby

Tomcatを再起動する必要がある場合は、前の3つのコマンドを実行し、サーバーを起動する前に2つの環境変数を設定してください。

export CATALINA_OPTS="-Xmx512m"
export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"
~/Tomcat/apache-tomcat-7.0.56/bin/catalina.sh start

結論

したがって、Ruby on Railsアプリケーションは、わずかな構成変更でJRuby on Railsアプリケーションに変換できます。 JRuby on Railsアプリケーションは、ほぼすべてのサーブレットコンテナで実行できます。 このチュートリアルでは、Apache TomcatとWinstoneで実行する方法を既に見てきました。

Related