JRubyを使用してApacheTomcat7およびUbuntu14.04でRailsアプリケーションを実行する方法
序章
Ruby on Rails(RoR)は非常に人気のあるフレームワークであり、開発者は最新のデザインパターンに準拠したWebアプリケーションをすばやく作成できます。 Railsを使用すると、わずかなコマンドで、コードをまったく記述せずに、本番環境に対応したバニラCRUD(作成、読み取り、更新、削除)アプリケーションを構築できます。 Apache Phusion Passenger、Unicorn、およびPumaは、Railsアプリケーションの実行に使用される人気のあるサーバーの一部です。
Ruby MRIのパフォーマンスは、ここ数年で大幅に向上しています。 ただし、JavaやCなどの言語に比べるとまだ遅いです。 重要な同時分散型のエンタープライズグレードのアプリケーションに必要な書き込み時間の短縮に関心がある場合は、代わりに、RubyのJava実装であるJRubyを使用する必要があります。
RubyMRIに対するJRubyのいくつかの利点
同時実行性— Ruby MRIはGIL(グローバルインタープリターロック)を使用するため、同時実行性が制限されます。 一方、JRubyはJVMのスレッドを使用できるため、はるかに高いレベルの並行性を実現できます。 これは通常、JRubyが他のルビーよりも選ばれる最も重要な理由です。
スレッドセーフ—Rubyのコアクラスのほとんどはスレッドセーフではありません。 マルチスレッドアプリケーションでこのようなクラスを使用すると、エラーが発生しやすくなります。 JRubyは、並列処理用に設計されたJavaのクラスを代わりに使用できます。
その他のライブラリ— JRubyを使用すると、Ruby gemのレパートリーだけでなく、すべてのJavaおよびScalaライブラリを自由に使用できます。 これにより、アプリケーションのコア機能にさらに集中できます。
展開のしやすさ— JRuby on Railsアプリケーションを単一のWARファイルにパッケージ化して、任意のJavaEEサーバーに簡単に展開できます。 それらの多くは、アプリケーションを管理するためのブラウザベースのインターフェイスさえ持っています。
このチュートリアルの内容
このチュートリアルでは、次のことを学習します。
- Rails(Ruby MRIを使用するもの)を使用して単純なCRUDアプリケーションを作成する
- RubyonRailsアプリケーションをJRubyonRailsアプリケーションに変換します
- アプリケーションのWARファイルを生成します
- ApacheTomcat7をインストールします
- WARファイルをTomcatサーバーにデプロイします
チュートリアルの最後に、動作するJRubyonRailsアプリケーションがデプロイされます。
前提条件
-
32ビットUbuntu14.04ドロップレットをデプロイします。 TomcatとJRubyは64ビットサーバーで実行されますが、速度が低下する可能性があります。
-
sudoユーザーを作成します。
-
ドロップレットのRAMが2GB未満の場合は、少なくとも1GBのスワップスペースを追加する必要があります。 詳細については、次のチュートリアルを参照してください: Ubuntu14.04にスワップを追加する方法。
-
最新バージョンのRVMをマシンにインストールします。 次のチュートリアルのステップ1を参照してください:RVMを使用してUbuntu12.04LTS(Precise Pangolin)にRubyonRailsをインストールする方法。 RVMをインストールする前に、キーを追加する必要がある場合があります。
gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
rvm要件コマンドを使用してそのチュートリアルに従ってください。
ステップ1—シンプルなCRUDRoRアプリケーションを作成する
RVMを初期化します。 この初期化は、新しい端末を開くたびに必要です。
. ~/.rvm/scripts/rvm
注:Ruby 1.9.3を使用するRailsアプリケーションが既にある場合は、ステップ2にスキップできます。
すべてのRailsアプリケーションを格納するディレクトリを作成し、そのディレクトリに入ります。
mkdir ~/my_applications
cd ~/my_applications
このチュートリアルではRuby1.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を使用してGemfileを編集し、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 'therubyracer'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'spring', group: :development
削除する必要があります , platforms: :ruby
コメントの一部 therubyracer
最終的にはRubyではなくJRubyを使用するためです。
Gemfileにリストされているすべてのgemをインストールします。
bundle install
Railsのスキャフォールディング機能を使用して、アプリケーションに数ページを追加します。
rails g scaffold Employee name:string age:integer address:text
The rails g scaffold
コマンドはいくつかの移行を生成します。 それらを適用します:
rake db:migrate
アプリケーションのルートを変更して、すべての従業員のリストを表示します。 nanoを使用して編集します ~/my_applications/simple/config/routes.rb
そして、その内容を、コメントを除いた以下に示すものに変更します。
Rails.application.routes.draw do
resources :employees
root 'employees#index'
end
これで、RubyMRIを使用するRailsアプリケーションの準備が整いました。 次のように入力して、開発サーバーで実行します。
rails s
起動には1〜2分かかります。
にアクセスすると、ブラウザでアプリケーションにアクセスできます。 http://
コンソールに戻り、 Ctrl +Cを押してサーバーを停止します。
ステップ2—Java8をインストールします
JRubyをインストールして使用するには、JDKが必要です。 Oracle JDK 8は、追加後にapt-getを使用してインストールできます。 webupd8team/java
PPA。
次のように入力して、リポジトリを追加します。
sudo add-apt-repository ppa:webupd8team/java
Enter を押して、新しいリポジトリを受け入れます。
apt-getのパッケージインデックスファイルを更新します。
sudo apt-get update
OracleJDK8をインストールします。
sudo apt-get install oracle-java8-installer
注:実際のインストールを開始する前に、ライセンス契約に同意するように求められます。
選択する
インストールが完了したら、次のコマンドを実行します。
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をRailsにインストールする
RVMを使用して、JRubyをインストールして使用します。
rvm install jruby
rvm use jruby
これで、JRubyの最新バージョン(2014年11月現在1.7.16.1)を使用できるようになりました。 バージョンを確認してください:
jruby -v
これは、サーバーがOracleJDK8を使用していることを示しています。 次のような出力が表示されます。
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をRailsにインストールします。
gem install rails -N
これでJRubyonRailsがインストールされました。
ステップ4—JRubyを使用するようにアプリケーションを構成する
多くのRubyMRIgemはJRubyによってシームレスにサポートされていますが、ネイティブコードを持つ一部のgemはサポートされていません。 データベースへのインターフェイスであるほとんどのgemは、このカテゴリに分類されます。 私たちのアプリケーションは現在、JRubyでサポートされていないsqlite3gemを使用しています。 代わりに、activerecord-jdbcsqlite3-adapterを使用する必要があります。
同様に、JRubyはJavaScriptエンジンとしてtherubyracerジェムの代わりにtherubyrhinoを使用します。
nanoを使用して編集します ~/my_applications/simple/Gemfile
この変更を行います。
nano ~/my_applications/simple/Gemfile
コメントを除いた2行を更新すると、ファイルは次のようになります。
source 'https://rubygems.org'
gem 'rails', '4.1.7'
gem 'activerecord-jdbcsqlite3-adapter'
gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'therubyrhino'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'spring', group: :development
以前に行っていなかった場合は、今すぐ削除する必要があります platform
therubyrhinoラインからの設定。
一部のgemにはネイティブ拡張が必要です。 次のように入力して、JRubyがC拡張機能をサポートできるようにします。
echo "cext.enabled=true" >> ~/.jrubyrc
これで、新しく追加されたgemをインストールできます。
bundle install
SQLite3をデータベースとして使用していない場合は、次のいずれかのgemが必要になる可能性があります。
- ダービーの場合: activerecord-jdbcderby-adapter
- MySQLの場合: activerecord-jdbcmysql-adapter
- Postgresの場合: activerecord-jdbcpostgresql-adapter
ステップ5—Javaのポリシーファイルを更新する
ブラウザを使用して、 JCE UnlimitedStrengthJurisdictionポリシーファイルをダウンロードします。 最初にオラクルのライセンス契約に同意する必要があります。
(契約に同意する必要があるため、ファイルを wget することはできません。)
ローカルコンピューターで、scpを使用してファイルをサーバーにアップロードします。
scp Downloads/jce_policy-8.zip user@server-ip:~
サーバーに、解凍ユーティリティをインストールします。
sudo apt-get install unzip
/tmpのディレクトリにあるファイルを解凍します。
cd /tmp
unzip ~/jce_policy-8.zip
ポリシーファイルをJREのlib/securityディレクトリにコピーします。
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://
ターミナルに戻り、 Ctrl +Cを押してサーバーを停止します。
ステップ6—アプリケーションをデプロイ可能なWARファイルとしてパッケージ化する
TomcatなどのサーブレットコンテナでJRubyonRailsアプリケーションを実行するには、最初にWAR(WebアプリケーションARchive)ファイルにパッケージ化する必要があります。 これは、warblergemを使用して実行できます。
warblerをインストールします。
gem install warbler
アプリケーションが使用するSQLiteデータベースは、現在アプリケーションのディレクトリにあります。 WARファイルが生成されると、現在の状態のデータベースがWARファイル内に配置されます。 アプリケーションが再デプロイされると、デプロイメント後にデータベースに加えられた変更が上書きされるため、これは望ましくありません。
したがって、SQLiteデータベースファイルは、アプリケーションのディレクトリ外の場所に移動する必要があります。
データベース用の新しいディレクトリを作成します。
mkdir -p ~/databases/simple
このチュートリアルでは、開発データベースについてのみ説明します。 したがって、開発データベースファイルを新しく作成したディレクトリに移動します。
mv ~/my_applications/simple/db/development.sqlite3 ~/databases/simple
nano を使用して、database.ymlファイルを編集します。
nano ~/my_applications/simple/config/database.yml
開発データベースのパスを更新します。 このチュートリアルでは詳細が必要ないため、他の環境の詳細を削除することもできます。 変更後、ファイルは次のようになります。
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *default
database: ~/databases/simple/development.sqlite3
Warblerは、WARのRails環境も知っている必要があります。 このチュートリアルでは、開発環境に固執します。 これは、を使用して指定されます config/warble.rb
ファイル。
nano を使用して、warble.rbという名前の新しいファイルを作成します
nano ~/my_applications/simple/config/warble.rb
ファイルに以下を追加します。
Warbler::Config.new do |config|
config.webxml.rails.env = 'development'
end
これで、アプリケーションをWARファイルにパッケージ化する準備が整いました。 次のコマンドを実行してファイルを生成します。
warble executable war
これには少し時間がかかります。
正常な出力は次のようになります。
Downloading winstone-0.9.10-jenkins-43.jar
rm -f simple.war
Creating simple.war
この時点で、アプリケーションのディレクトリにsimple.warという名前のファイルがあります。 引数executableをコマンドに追加すると、小さな組み込みサーバー(Winstoneと呼ばれる)を含むWARファイルが生成されます。 このファイルは、次のように(外部サーバーなしで)独立して使用できます。
java -jar simple.war
これは、WARファイルに問題がないかどうかを確認するための良い方法です。 これで、ブラウザを使用してアクセスできます http://
次のような出力が表示されるまで待って、サーバーが起動したことを通知する必要があります。
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
回避するために、Tomcatで使用可能な最大ヒープサイズを512mに設定します java.lang.OutOfMemoryError
. このエクスポートは、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 を押して、tailコマンドを終了します。
これでTomcatがインストールされ、実行されます。 ブラウザを使用してアクセスできます http://
ステップ8—アプリケーションをTomcatにデプロイする
WARをTomcatにデプロイするには、それをTomcatのwebappsフォルダーにコピーするだけです。
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://
セッションを再開する
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アプリケーションは、わずかな構成変更でJRubyonRailsアプリケーションに変換できます。 JRuby on Railsアプリケーションは、ほぼすべてのサーブレットコンテナで実行できます。 このチュートリアルでは、ApacheTomcatとWinstoneで実行する方法をすでに見てきました。