Rails 2.2以降 + PassengerでRailsBaseURIが機能しない
某プロジェクトの関係でソースコードを共有する仕組みを考えていたのですが、最近はgithubを使うのがはやりのようです。これまではsubversionを使っていたのですが、よい機会だと思いgitに手をだしてみることにしました。そこでgithubを使おうと思ったのですが、はじめはソースをプライベートの状態で開発を開始したいとの申し出でしたので、githubを前提とするならば有償サービス(最低7ドル、機能対価格表)を利用しなければいけないようでした。そこでgithubクローンで、かつ、rails上で動くオープンソースのgitoriousを試してみることにしました。今回の記事はそのインストールで躓いた部分の備忘録です。
gitoriousにはインストールレシピがあり、ubuntu用チュートリアルを参考に行いました。基本的にそのチュートリアルをなぞればパッケージの導入自体は完了しました。railsをapacheと協調動作させるためのpassenger(いわゆるmod_rails)については、プロジェクト管理ツールのredmineを前回インストールした際に導入済みでしたので、これといって難しいこともありませんでした。
一つ躓いたことといえば、7.4のrakeを使う部分でrake db:create RAILS_ENV=productionをしようとしてもエラーで止まってしまうので、mysqlのコンソールに入り、CRETAE DATABASE gitorious_production;と手動でSQLを発行する必要がありました。
このチュートリアルを元にインストールをすると、gitoriousを動作させるサイトは(バーチャル)ホストのルート(要はhttp://gitorious.naruoka.org/のようなURL)になりますが、それではいやなので、passengerのマニュアルに従って、動作するURLを1階層下に落とす(http://www.naruoka.org/gitorious/のようなURL)ことにしました。RailsBaseURIをapacheの設定ファイル内で宣言するなどすればよいようです。
しかしながら404のページが表示されてしまい、うまく動作しませんでした。redmineのときはRailsBaseURIを設定するだけでルートでなくとも動作したので、思い当たる原因がありません。
しかたがないのでエラーの箇所を突き止めるべく、ソースを弄りだします。まずは404のページだけではデバックのしようがないので、404ページをリンダリングしているrails提供のファイルgitorious/app/controllers/application.rbのApplicationController.render_not_foundメソッドをrender :text => $!.inspect + $@.inspectとして、エラー情報を吐き出させるようにしました。するとgitorious/vendor/rails/actionpack/lib/action_controller内でURLが解決できなく困っているようです。『ActionController RailsBaseURI』をキーワードに検索すると、『RailsBaseURI and relative_url_root』という、まさしく探していた情報が手に入りました。どうやらRailsに付属するActionControllerの仕様が2.2から変更されたために生じた問題のようです。実際、vendor/rails/actionpack/lib/action_pack/version.rbを見てみるとgitorious付属のrailsのバージョンは2.2.2とありますので、どうやらこの原因で間違いがないようです。
解決方法を探ってみると、結局config/environment.rbから呼び出される環境別の設定ファイルconfig/environments/production.rbにおいて、config.action_controller.relative_url_root='/gitorious' とすることで解決できました。散々引っ張っておきながら、これだけで解決してしまうあたりがなんともフレームワークを利用しているという感じです。こんな簡単に解決する話なら、gitorious本家のマニュアルにも書いておいて欲しいものです。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。