ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

Railsの本番環境移行でめちゃめちゃ行き詰まる

Railsの特徴として、「動くものがすぐできる」というのがある一方、
本番で動かすのは結構面倒だったりします


それでも、passengerを使えばApache単体で処理できるので、
これのおかげでかなり楽になり、
現在はredmineをpassengerで動かしてます(`・ω・´) b


そこまでは良かったのですが、
今度は開発中のツールを同じ環境で動かしたいと思い、
いろいろやってみたのですが、とにかく行き詰まったのです


個々のポイントについて書かれた記事はたくさん見つかるものの、
全体の流れが書いてある記事があまりなかった気がするので、
主に自分用にメモ...φ(・ω・`)

環境

OS:CentOS 4.7
Ruby:1.8.7
Rails:2.2.2
Passenger:2.2.2
開発ツール:Netbeans IDE 6.5.1

※すでにredmineがpassengerで動いているものとする

passengerで複数のRailsアプリを動かす

ドキュメントの通りにpassengerを設定すると、
一つのアプリしか動かせないように見えますが、
手持ちの本にやり方が書いてありました(`・ω・´) b

Railsレシピブック 183の技

Railsレシピブック 183の技

やり方をそのまま書くのもあれなので、
ざっと手順だけ

  1. Railsアプリを適当な場所にUP
  2. DocumentRoot以下に[RAILSROOT]/publicへのシンボリックリンクを作成
  3. httpd.confに設定を追加
  4. Apache再起動
設定例:

 ServerName hogerails
 DocumentRoot /var/hoge/rails

 RailsBaseURI /redmine
 RailsBaseURI /hogesys

この設定の場合、/var/hoge/rails/redmineとしてシンボリックリンクを作ればOKです
アクセスは「http://hogerails/redmine」でいけます

cache_template_loading

これでredmineは完全に動いたものの、肝心のツールが動かないのです
エラーはこんな感じ

undefined method `cache_template_loading=' for ActionView::Base:Class


とりあえず、本番環境で動かないって事例をググったところ、
tmpやlogディレクトリがないと動かない、という記事を発見
ソース管理するとき除外していたので、これを追加


それでもエラーが変わらないので、このエラーメッセージでググると、
config/environments/production.rbの以下の記述をコメントアウトしろと

# config.action_view.cache_template_loading = true

passengerに絡む問題らしいですが、
とりあえずこれでエラーが変わったので次へ

クッキーの問題

今度はこんなエラーが

CGI::Session::CookieStore::TamperedWithCookie 〜

どうみてもクッキー絡みと思われますが、
とりあえずこのメッセージでググったところ、
ブラウザのクッキーをクリアせよ、と


どこでクッキーを拾ったのかわかりませんが、
クリアしてみたら別なエラーに

config.cache_classes

ここが最大の山場で、ある意味では未解決なのですが・・・
今度のエラーはこんな感じ

no such file to load -- application

requireするファイルが見つからない時のエラーですが、
「application」ってのが何を指しているのかわかりません(´・ω・`)


production環境だから悪いのかと思って、
developmentやtestでWEBRickを起動しようとしたところ、
testでも同じエラーを吐いて落ちます


ということは、config/environments以下の設定ファイルに差があるのだろうと、
3つのファイルをにらめっこしてたどり着いたのがこちら(´・ω・)っ

#config.cache_classes = true
config.cache_classes = false

これで動きはしたものの、わざわざdevelopmentでだけ有効な設定なわけですし、
何か意味があるはずです


ということで調べてみた結果、
これをtrueにすると"require"でモジュールをロードし、
falseにすると"load"を使うことが判明


loadは毎回ファイルを読み込むけども、requireは一度しか読まない、
ということはわかったものの、なぜrequireが通らないのか不明
そもそも、自分のコードは全部requireなんですが・・・


WindowsのWEBRickでも同じ現象になったので、
確実に自分の書いているコードの問題と思われますが、
そこは本題ではないので後回しにして次へ

route missing

ここまでやって、やっと見慣れた500エラーに
つまり、Railsアプリ自体がなんかエラーを吐いた、と


logを見てみたところ、「/hogesys/xxxなんてルートはしらねーYO!」って出てます
かといって、/xxxだけだとApacheが404を返してしまうのです


つまり、/hogesysはpassengerのために切ったディレクトリなのですが、
このPathをそのままRailsに渡してしまうため、
Railsのroutes.rbにない、というエラーになったと


だったらredmineはどうしてるのかと思って、
redmineのroutes.rbを見てみたら、
特に何も書いてないのですΣ(・ω・ノ)ノ


ここでまた行き詰りましたが、
Railsをサブディレクトリで動かす方法を試したら動きました

# in config/environments/production.rb
(略)
config.action_controller.relative_url_root='/hogesys'

動いたのでいいのですが、それにしてもredmineのケースが謎です
何が違うのか・・・


あと、簡易メニューのつもりで、public/index.htmlに、
各機能へのリンクを書いておいたのですが、
/hogesysというディレクトリを切ったため、全部書きなおしに


そもそも、redmineの場合・・・

map.home '', :controller => 'welcome'

・・・とか書いているので、メニューのcontrollerを準備して、
public/index.htmlは削除の方が妥当かもしれません


ただ、routes.rbのコメントを見ると、
TOPを表示するには「map.root」を使えと書いてあったので、
どっちがいいのかいまいち不明

まとめ

というわけで、ここまでの段階で一応Railsアプリが動いたものの、
routesの修正とか、cache_classesの調査とか、
いろいろやることが出てきてしまいました


passengerがいくら優秀とはいえ、
やっぱりRailsを本番で動かすのは難しい・・・(´・ω・`)