1台のサーバでRailsアプリを何個も動かす
そもそも
Railsは、ローカルPC上でサクッとアプリが作れて好きなんだけど、いざどこかのサーバで公開しようとすると、
- アプリ毎に、rubyバージョン・必要なgemが異なる場合がある(ほぼ確実?)
- アプリ毎に、ポートが一つ必要
て感じの縛りがあり、 やりづらいのでどうにかしたい。
出来る事なら、一台のサーバ上で色々なRailsアプリを動作させたい。
ので解決策を探してみた。
rubyバージョン、gem問題
一つ目の課題の
- アプリ毎に、rubyバージョン・必要なgemが異なる場合がある(ほぼ確実?)
に関しては、
あたりが解決の有力な選択肢っぽい。
どちらでも行けるようだが、rbenvの方が後出し(=RVMの不便な点を解消しようとしてる)で、構造がシンプルで好ましいので、こっちを使うことにする。
インストールは公式の通りにやって行けばOK。
# 非力な環境なので rbenv install XXXXX で不安になるほど時間かかった。
ポート問題
二つ目の課題の
- アプリ毎に、ポートが一つ必要
に関しては
- Apache + Passenger
で解決できるっぽい。
Apacheのインストールは普通に(yumとか使って)するとして、Passengerのインストールはこちらのページ(の途中から)を参考にさせていただいた。
Amazon Linuxにrbenv+Ruby+Apache+Passengerの環境を作る - okochangのインフラ日誌
とりあえず動かしてみる
使う技術の方針がだいたい決まったところで、とりあえず動かしてみる。
いざサーバでRailsアプリを動かしたところ、Passengerのエラー画面が出て
cannot load such file -- bundler/setup (LoadError)
とのこと。
どうもbundleがうまく行ってないようだ。
(上記エラーはそもそもbundlerが無い、って事かな?)
ところが、bundle install をしてもgemは全部あるといわれる。
しかし、gem list をするとgemは足りない。
もう少し見てみたところ、どうも
- 【前提】今まで素でrails開発を行っていた環境にrbenvを導入した
- なのでベース環境(rbenvでいう所のsystem)には必要なgemが揃ってる
- bundlerはsystemの方を(方も?)見に行くようだ
- 対して、実行時及びgemコマンドはrbenvで切り替えた環境を見に行くようだ
- 結果、bundle installすると全部あるのに、実行時にはgemが足りないことになる
という事っぽい。
# ちなみに gem env をしてみると GEM PATHS にrbenvとsystemの二つのパスが含まれていた
ベース(system)のgemに何も入れないうちにrbenv使い始めればこの現象起こらないのかもしれない。
でも、今更全部インストールし直すのもめんどくさいしなー、どうしようかなーと思ってたら、
rbenv exec bundle install
でbundle installがrbenv環境に働くのを見つけた。
rbenv exec ~~って何だろう、と思ったらどうやらrbenv help execに説明があるみたい。
rbenv 管理下の Ruby での Rails 開発環境を整えて Redmine を動かす | EasyRamble
どうやら、選択中のバージョンの Ruby へのパスを $PATH の先頭に追加して実行するのと同じことらしい。ということで確実に現在の Ruby 環境でコマンドが実行されることを保証する…という意味でしょうかね。
ふむ。
Railsのサブディレクトリ運用
つぎに、Railsアプリのrootをサーバのサブディレクトリに持ってくるようにして、複数のRailsアプリが動くようにした。
参考にしたのはこのページ。
Passengerを使ってRailsアプリケーションを複数動かす | 僕はそーぞーりょくが足りない
Rails毎のrubyバージョン、gem環境の指定
ここまでで一台のサーバ上に複数のRailsアプリを動かす事は「一応」できた。
でももっと厳密にやるならRails毎にrubyのバージョンやgem環境を変える必要がある。
で、環境の指定についてだけど、
Passengerの設定オプション — Redmine.JP 経由で
Phusion Passenger users guide, Apache version に辿り着いた。
これによると、rubyのバージョンについてはPassengerRubyを設定することで指定できるらしい。
指定範囲はglobalでも<VirtualHost>でも<Directory>でも<Location>でも良いらしい。
また、gem環境についてだが、
http://www.modrails.com/documentation/Users%20guide%20Apache.html#bundler_support
にあるように、自動的にGemfileを見てBundler.setup()をしてくれるそうな。
なのであらかじめbundle installがしてあれば問題ない、という事っぽい。
終わり
というわけで複数のRailsが一台のサーバで動くっぽい。
めでたい。