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
- 作者: 高橋征義,諸橋恭介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2008/05/31
- メディア: 単行本
- 購入: 37人 クリック: 567回
- この商品を含むブログ (95件) を見る
やり方をそのまま書くのもあれなので、
ざっと手順だけ
設定例: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」を使えと書いてあったので、
どっちがいいのかいまいち不明