よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

jetty

JRuby1.1がリリースされたので、Pure Javaの軽量WEBサーバで、さらにServletコンテナを搭載しているJettyで動作するかを確認してみました。

まずは、JRuby1.1をダウンロードしてきて、/usr/local/ 以下に展開しておきます。
その後は、gemでいくつかのパッケージをインストールしておきます。

$ /usr/local/jruby-1.1/bin/gem install rake rails activerecord-jdbcmysql-adapter


方法は簡単で、goldspikeプラグインをvendor/plugin以下にインストールします。

今回はgoldspikeの最新版は以下からチェックアウトできます。
#最新版をインストールしないと動かないこともあるらしいです・・・。

svn export http://jruby-extras.rubyforge.org/svn/trunk/rails-integration/plugins/goldspike/

続いて、goldspikeの中身を少しだけ変更しておきます。
これをしないと、DBとの通信がうまくいきません。

$ vi vendor/plugins/goldspike/lib/war_config.rb

100行目あたりに、gemを追加する箇所(# default gems)があります。
rails,activerecord-jdbc-adapterはadd_gemしてありますが、activerecord-jdbcmysql-adapterが追加されていないので、これを追加するようにしたいので、以下を追記しておきます。

add_gem('activerecord-jdbcmysql-adapter')

#今回はDBにMySQLの利用を想定していますので、他のDBを使用する際はそれらにあわせて変更してください。

では、activerecord-jdbc経由でDBにアクセスできるように、config/database.ymlの設定を変更します。

アダプタはjdbcmysqlに設定し、文字化け対策としてエンコーディングも指定しておきます。

adapter: jdbcmysql
(略)
encoding: utf8

最後に、今回はrails-2.0.2で動作させたいと思うので、vendor/railsを削除しておいてください。
rails-1.2.6など2.0系で動作させない場合は、config/environment.rbに追加設定が必要となりますので。

ついでにここで、Redmine側の設定を済ませておいてください。
#migrateやら初期データのロードなど。

では、早速jettyで動かしてみます。

$ /usr/local/jruby-1.1/bin/rake war:standalone:run

すると以下のように$RAILS_ROOT以下にWEB-INFが作成されており、いろんなモジュールが追加されてます。

info: Assembling web application
info: Packing needed Java libraries ...
info: adding Java library jruby-complete-1.1
info: adding Java library goldspike-1.6.1
info: adding Java library activation-1.1
info: adding Java library commons-pool-1.3
info: adding Java library bcprov-jdk14-124
info: Packing needed Ruby gems ...
info: adding Ruby gem activerecord-jdbc-adapter version 0.8
info: adding Ruby gem activerecord-jdbcmysql-adapter version 0.8
info: adding Ruby gem jdbc-mysql version 5.0.4
info: Packing needed files ...
java -Xmx128m -Djetty.port=8080 -cp "tmp/jetty/start-6.1.1.jar:tmp/jetty/jetty-6.1.1.jar:tmp/jetty/jetty-util-6.1.1.jar:tmp/jetty/servlet-api-2.5-6.1.1.jar:tmp/jetty/jetty-plus-6.1.1.jar:tmp/jetty/jetty-naming-6.1.1.jar" org.mortbay.start.Main tmp/jetty/jetty.xml
2008-04-13 16:40:43.880::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
2008-04-13 16:40:44.061::INFO: jetty-6.1.1
2008-04-13 16:40:44.178::INFO: NO JSP Support for /redmine-0.6.4, did not find org.apache.jasper.servlet.JspServlet
2008-04-13 16:40:48.366::INFO: Started SelectChannelConnector @ 0.0.0.0:8080

ひとまず動いたように見えるので、http://localhost:8080/redmine-0.6.4 にアクセスしてみます。すると、ディレクトリ構造が見えるだけです。うまく起動できていません。l
そのため、起動前に作成されたWEB-INFの中をのぞいてみます。

$ ls WEB-INF/
classes gems lib

web.xmlが存在していません。
そのため、以下からテンプレートをコピーしてきます。

$ cp vendor/plugins/goldspike/generators/goldspike/templates/web.xml.erb WEB-INF/

これだけでは、起動時にエラーでとまってしまいます。
なぜテンプレートがこのようになっているのかはわかりませんが、コピーしたweb.xml.erbの中でコードを埋め込む箇所でいくつかの箇所が、%%となっています。
そのため、すべて%に置換します。
vimを利用されている場合は、以下で確認しながら置換することができます。

:%s/%%/%/gc

ここまで終了したら、再度チャレンジしてください。

$ /usr/local/jruby-1.1/bin/rake war:standalone:run

以下にアクセスするとRedmineがうごいているはずです。

http://localhost:8080/redmine-0.6.4/

使ってみたところ、多少、モッサリした感はありますが、まぁまぁいい感じで使えるのではないでしょうか。

glassfishにwarをデプロイする作業を減らすことができるのが今回のメリットですかね。