akishin999の日記

調べた事などを書いて行きます。

Ruby 1.9.3 & Passenger 3.0.9 で「Unexpected end-of-file detected」

自宅サーバRuby を 1.9.3 にアップデートした途端、以下のようなエラーが出るようになりました。

アプリケーション側の対応が必要なのかな?とも思ったのですが、Apache の error_log を調べてみるとどうやら Passenger 側の不具合のようです。

 ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
 
 [NOTE]
 You may have encountered a bug in the Ruby interpreter or extension libraries.
 Bug reports are welcome.
 For details: http://www.ruby-lang.org/bugreport.html
 
 /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.9/lib/phusion_passenger/platform_info/operating_system.rb:33: Use RbConfig instead of obsolete and deprecated Config.
 [ASYNC BUG] thread_timer: select
 EBADF

以下の Ruby のチケットに原因が説明されています。

ruby-trunk - Bug #4958: Internal server error (PhusionPassenger::Rack::ApplicationSpawner::Error) - Ruby Issue Tracking System
http://redmine.ruby-lang.org/issues/4958

Passenger の Issues にもちゃんと登録されていました。

Issue 714 - phusion-passenger - Phusion Passenger + Ruby 1.9.3: forking results in closing internal Ruby file descriptors - Phusion Passenger (mod_rails/mod_rack) - Google Project Hosting
http://code.google.com/p/phusion-passenger/issues/detail?id=714&sort=-stars&colspec=ID%20Type%20Status%20Priority%20Milestone%20Stars%20Summary

しばらく待っていたら、どうやら最近 github の master ブランチの方が修正されたそうなので、gem のリリースを待たずにインストールしてみます。

gem のリリース状況を確認

念のためまだ最新版がリリースされていないことを確認します。

# gem list -r ^passenger$

*** REMOTE GEMS ***

passenger (3.0.9)

まだ 3.0.9 以降がリリースされていなければ、下記の手順で Github から最新の Passenger をインストールする必要があります。

現在使用中の Passenger をアンインストール

まずは現在入ってる Passenger をアンインストールします。

# gem uninstall passenger
Remove executables:
        passenger, passenger-install-apache2-module, passenger-install-nginx-module, passenger-config, passenger-status, passenger-memory-stats, passenger-make-enterprisey

in addition to the gem? [Yn]  Y
Removing passenger
Removing passenger-install-apache2-module
Removing passenger-install-nginx-module
Removing passenger-config
Removing passenger-status
Removing passenger-memory-stats
Removing passenger-make-enterprisey

gem ファイルの作成

Github の master からソースコードをダウンロードし、gem ファイルを作成します。

# wget --no-check-certificate --content-disposition https://github.com/FooBarWidget/passenger/tarball/master
# tar xzf FooBarWidget-passenger-release-3.0.9-39-gd35a5ae.tar.gz
# cd FooBarWidget-passenger-d35a5ae
# rake package

上記で FooBarWidget-passenger-d35a5ae/pkg 以下に passenger-3.0.9.gem が作成されます。
バージョンは 3.0.9 となっていますが、master ブランチの最新のソースコードがビルドされているのでこのままで OK です。

インストール

作成された gem をインストールします。

# cd pkg
# gem install --local passenger-3.0.9.gem

Apache モジュールをインストールします。

# passenger-install-apache2-module

インストールが完了したら Apache を再起動します。
バージョンが変わるなど、インストールパスが変わった場合は Apache の設定ファイルを修正してから再起動します。

これで Ruby 1.9.3 + Passenger で Rails アプリケーションが動作するようになったはずです。
最新版の公式リリースが出たら差し替えた方が良さそうですが、取り合えずこれで急場は凌げそうなので、困っている方は試してみてください。