序章

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:// :3000 。 いくつかのレコードを作成して、すべてが期待どおりに機能していることを確認します。

コンソールに戻り、 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:// :3000 アプリケーションをテストします。 現在、Ruby MRIを使用する代わりにJVMで実行されているという事実を除けば、アプリケーションについて何も変わらないはずです。

ターミナルに戻り、 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:// :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

回避するために、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:// :8080 。 Tomcatのウェルカムページが表示されるはずです。

ステップ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:// :8080 / simple / そして、Tomcatで実行されているJRubyonRailsアプリケーションを確認してください。

セッションを再開する

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で実行する方法をすでに見てきました。