ksr dev

主に技術系(の予定)。気になったコト・モノを散文的に。

1台のサーバでRailsアプリを何個も動かす

そもそも

Railsは、ローカルPC上でサクッとアプリが作れて好きなんだけど、いざどこかのサーバで公開しようとすると、

  • アプリ毎に、rubyバージョン・必要なgemが異なる場合がある(ほぼ確実?)
  • アプリ毎に、ポートが一つ必要

て感じの縛りがあり、 やりづらいのでどうにかしたい。

出来る事なら、一台のサーバ上で色々なRailsアプリを動作させたい。

 

ので解決策を探してみた。

 

rubyバージョン、gem問題

一つ目の課題の

  • アプリ毎に、rubyバージョン・必要なgemが異なる場合がある(ほぼ確実?)

に関しては、

あたりが解決の有力な選択肢っぽい。

 

どちらでも行けるようだが、rbenvの方が後出し(=RVMの不便な点を解消しようとしてる)で、構造がシンプルで好ましいので、こっちを使うことにする。

インストールは公式の通りにやって行けばOK。

# 非力な環境なので rbenv install XXXXX で不安になるほど時間かかった。

 

ポート問題

二つ目の課題の

  • アプリ毎に、ポートが一つ必要

に関しては

で解決できるっぽい。

 

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は足りない。

 

もう少し見てみたところ、どうも

  1. 【前提】今まで素でrails開発を行っていた環境にrbenvを導入した
  2. なのでベース環境(rbenvでいう所のsystem)には必要なgemが揃ってる
  3. bundlerはsystemの方を(方も?)見に行くようだ
  4. 対して、実行時及びgemコマンドはrbenvで切り替えた環境を見に行くようだ
  5. 結果、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が一台のサーバで動くっぽい。

めでたい。