Redmineを運用するためのイロハを身につけよう

第7回Javaプラットフォームでの運用

前回は軽量WEBサーバであるlighttpdを利用することでRedmineをより良いパフォーマンスで動かすための方法を紹介しました。今回はRedmineをJava EEのアプリケーションサーバで運用するための方法を紹介します。

読者の方には既にJava環境で他システムを運用している方もいらっしゃるかと思います。そのような場合に、Java EEのアプリケーションサーバとJRubyを利用することで、既存の環境に出来るだけ手を加えずにRedmineを運用したいという要望を実現することができます。

Java EEのアプリケーションサーバは数多く存在しますが、今回はその中でも多くの機能を兼ね備えており、注目度が高いオープンソース・プロダクトであるGlassfishで運用するための方法を解説します。

Glassfish以外にもRailsアプリケーションを運用することができるアプリケーションサーバには以下のようなものもあります[1]⁠。

  • Tomcat
  • WebSphere
  • Oracle OC4J
  • BEA Weblogic

それでは始めに、Javaで実装されたRubyであるJRubyを利用することのメリットと、Java EEのアプリケーションサーバで運用するメリットを整理しておきます。

JRubyを利用することで得られるメリット

  • Rubyの特性がそのままメリットとなる
  • Javaとの連携が可能でJavaライブラリを活用する事ができる
  • JDBCドライバを利用することで対応DBを増やすことができる

Java EEのアプリケーションサーバで運用することで得られるメリット

  • Java EEの運用環境の良さをそのまま得られる
    • 情報量が豊富で、多くの運用実績がある
    • パフォーマンス・安定性を獲得できる
    • 運用監視が充実している
    • スケールアウトしやすい

上記のように数多くの恩恵を受けることができます。それでは、RedmineをJava EEのアプリケーションサーバで稼動させる方法を紹介していきます。運用する環境にRubyを導入するのが難しいという方は、JRubyと glassfishを利用してJavaプラットフォーム上でRedmineを稼動させてみましょう。

環境構築

Redmineを運用するサーバと動作確認を行うサーバ(テストサーバ)が異なっている場合、それぞれのサーバで必要となるミドルウェアが異なります。今回は、テストサーバでWARファイルを作成してからテストサーバのglassfishにデプロイし、動作確認を済ませた後に、運用サーバの glassfishにWARファイルをデプロイさせて運用するというスタイルを前提に解説していきます。

以上の前提より、テストサーバおよび運用サーバでは、以下のものが必要となります。

テストサーバ
  • JRubyもしくはRuby
  • warファイル生成のためのプラグインであるgoldspike
  • マイグレートするためのrakeパッケージ
  • JDBC接続用のgemパッケージ
    • jdbc-mysql
    • activerecord-jdbcmysql-adapter
    • activerecord-jdbc-adapter
  • glassfish
運用サーバ
  • JRubyもしくはRuby
  • マイグレートするためのrakeパッケージ
  • glassfish

本連載の第1回でRubyおよびrubygemsのインストール方法は紹介しましたので、今回は、JRubyのインストール方法を解説します。

JRubyの導入

JRubyを利用するためには Java SE 5.0 以降が必要となります。今回は JDK 6.0 Update6 を /usr/local 以下にインストールしておきます。ダウンロードすべきファイルおよびインストール手順はJava SE Downloadsサイトに紹介されていますので、そちらを参考にしてください。

続いて以下のURLにアクセスし、JRubyのバイナリ版をダウンロードします。

$ wget http://dist.codehaus.org/jruby/jruby-bin-1.1.2.tar.gz

ダウンロードしたファイルを今回は /usr/local 以下に展開します。

$ tar xvzf jruby-bin-1.1.2.tar.gz

このままではコマンド実行時にフルパスを指定しなければならないため、ホームディレクトリ以下の.bashrcを編集し環境変数を設定します。

JAVA_HOME=/usr/local/jdk1.6.0_06
JRUBY_HOME=/usr/local/jruby-1.1.2

また、PATHの最後部に、${JAVA_HOME}/bin:${JRUBY_HOME}/bin を追加します。編集したファイルの設定を反映するために以下のコマンドを実行します。

$ source ~/.bashrc

続いて以下のコマンドを実行し、Javaが利用可能な状態になっていることを確認します。

$ java -version

java version "1.6.0_06"
Java(TM) SE Runtime Environment (build 1.6.0_06-b02)
Java HotSpot(TM) Client VM (build 10.0-b22, mixed mode, sharing)

JRubyについても確認しておきます。

$ jruby -v

ruby 1.8.6 (2008-05-28 rev 6586) [i386-jruby1.1.2] 

${RAILS_ROOT}に移動して、必要となるgemパッケージを以下のコマンドを入力することでインストールします。ちなみにjruby -Sをコマンドの始めに付けて実行することで、JRuby付属のコマンドを実行することができるようになります。

$ jruby -S gem install rake jdbc-mysql activerecord-jdbcmysql-adapter activerecord-jdbc-adapter

続いて、データベース接続設定ファイルである ${RAILS_ROOT}/config/database.yml を編集します。今回は、JDBC-MySQLを通してDBに接続させるためadapterを書き換えます。またエンコーディングを指定しないと文字化けしてしまうため、適切な文字コードを指定するようにしてください。※2⁠。

production:
adapter: jdbcmysql
database: redmine_development
host: localhost
username: root
password:
encoding: utf8

マイグレートを実施する場合は、DBのスキーマを作成してから以下のコマンドを入力してください。

$ jruby -S rake db:migrate RAILS_ENV=production

それでは最後にWEBrickを起動して、Redmineの動作確認をしましょう。

$ jruby script/server webrick -e production

ブラウザで http://localhost:3000 にアクセスすると、Rubyで動かした時とほぼ同等くらいのレスポンスでRedmineが動作することが確認できると思います。

WARの生成

Java EEのアプリケーションサーバでRedmineを運用するためには、ソースコードやライブラリを圧縮したWARファイルを生成してサーバにデプロイする必要があります。

WARファイルを作成するには、goldspikeプラグインを利用する方法と、gemでインストール可能であるwarblerを利用する方法の2種類があります。goldspikeはWAR生成時のファイル構成がJavaServletAPIに準拠した配置なっていませんが、warblerは準拠したものになっており、不要なファイルも排除されるようになっています。

今後はwarblerが主流となっていくのではないかと筆者は考えていますが、筆者の環境ではwarblerで生成したWARファイルを glassfishにデプロイしても、日本語化の設定ファイル(ja.yml)がロードされていなかったり、時折アプリケーションエラーが発生したりと正常に動作させることができなかったので、今回はgoldspikeを利用してWARを生成する方法を紹介します[3]⁠。

まずは${RAILS_ROOT}に移動してgoldspikeプラグインをインストールします。

 $ jruby script/plugin install
http://jruby-extras.rubyforge.org/svn/trunk/rails-integration/plugins/goldspike

インストール後は、${RAILS_ROOT}/vendor/plugins 以下にgoldspikeが追加されています。WAR生成設定ファイルである ${RAILS_ROOT}/vendor/plugins/goldspike/lib/war_config.rb を編集します。

# default build properties
@compile_ruby = false
@keep_source = false
@add_gem_dependencies = true
@servlet = 'org.jruby.webapp.RailsServlet'
@rails_env = 'production' #動作モードをdevelopmentにしたい場合はこちらを変更

・・・(略)

# default java libraries
add_library(maven_library('org.jruby', 'jruby-complete', '1.1.2')) #バージョンを1.1.2に変更

・・・(略)

# default gems
@gem_libraries = {}
add_gem('rails', rails_version) unless File.exists?('vendor/rails')
add_gem('activerecord-jdbc-adapter') if Dir['vendor/{gems/,}{activerecord-jdbc-adapter,ActiveRecord-JDBC}'].empty?
add_gem('activerecord-jdbcmysql-adapter') #新規追加
add_gem('jdbc-mysql') #新規追加

続いて、以下のコマンドを入力しWARを生成してください。このとき、jruby-complete-1.1.2.jarもwar内に格納されます。

$ jruby -S rake war:standalone:create

すると、${RAILS_ROOT}以下にredmine-[バージョン].warが生成されたことが確認できるはずです。

Glassfishの導入とWARのデプロイ

今回はglassfishバージョン2.0の最終ビルド版であるV2 UR2 b04をインストールします。

インストール手順はGlassfish Downloadsサイトに紹介されていますので、そちらを参考に /usr/local 以下にインストールしてください。

インストールが終了したらglassfishを起動します。

$ /usr/local/glassfish/bin/asadmin start-domain

それでは早速、先ほど生成したWARファイルをデプロイします。デフォルトの設定では、glassfishの管理画面へのアクセスは4848番ポートになっていますので http://localhost:4848 へアクセスし、デフォルトのアカウント:admin、パスワード:adminadmin でログインします。

glassfish管理画面面
glassfish管理画面

「管理画面でWebアプリケーション配備」を選択し、以下の内容で配備します。

「Application Server からアクセス可能なローカルのパッケージファイルまたはディレクトリ」を選択し、生成したWARファイルを指定
アプリケーション名:redmine
コンテキストルート:redmine

デプロイ完了後に http://localhost:8080/redmine にアクセスしてください。

仮に初期アクセス時にエラーが発生した場合は、glassfishのログもしくはredmineのログのいずれかを参照しエラー原因を調査してください。

glassfish/usr/local/glassfish/domains/domain1/logs/server.log
redmine/usr/local/glassfish/domains/domain1/applications/j
2ee-modules/redmine/log/production.log

最後に運用サーバにデプロイする際は、マイグレートや初期データのロードも忘れないようにしてください。

これでglassfishでRedmineを運用することができるようになりました。

ベンチマーク

第6回同様、Apache Benchを利用して簡単なパフォーマンスの測定をしてみます。

環境・条件

測定を行った環境は以下の通りで、Ruby + WEBrickで動かしたRedmineとJRuby + glassfishで動かしたRedmineについて比較します。

  • CentOS 4.4
  • Dual-Core AMD Opteron(tm) Processor 1210, 4GB Memory

比較対象となるWEB/アプリケーションサーバは以下のとおりです。

  • WEBrick(1.3.1⁠
    • Ruby(1.8.6), Rails(2.0.2), Redmine(0.7.1), productionモード
  • glassfish (V2 UR2 b04)
    • JRuby(1.1.2), Rails(2.0.2), Redmine(0.7.1), productionモード

今回はDBアクセスが発生するように、Redmineのある公開プロジェクトのトップページへ10回アクセスします。

結果

"Requests per second"の平均値は以下となります。

Ruby + WEBrick1.75 ⁠reqs/sec)
JRuby + glassfish1.89 ⁠reqs/sec)

この結果より、運用参考値ではありますが、JRuby + glassfishで運用した方がRuby + WEBrickで運用するよりも良い性能が出ていることがわかります。

最後に

今回は、goldspikeでWARを生成してglassfishにデプロイしJavaプラットフォームで運用するための方法を紹介しましたが、他にもJettyやglassfish gem(glassfish v3)などで稼動させることも可能です[4]⁠。

筆者の運用環境では、JRuby + glassfishを使って3ヶ月間ほどRedmineを稼動させていますが、Rubyで稼動させた場合とほぼ同等のパフォーマンス・高い安定性で稼動させることが出来ています。

これまで全7回の連載で、Redmineのバージョンアップ方法や新機能の紹介、Redmine運用管理者向けに管理機能の解説とlighttpdやglassfishでの運用方法などを紹介してきました。

Redmineは現在も開発されており、定期的にバージョンアップされていますので、これまでTracやMantisで課題管理されていた方はこれを機会にRedmineも試されてみてはいかがでしょうか。Redmineには他システムからのデータ移行ツールも提供されており、こちらに移行方法が記載されていますので、是非お試しください。

おすすめ記事

記事・ニュース一覧