Railsアプリのサブディレクトリで別Railsアプリを運用

LINEで送る
Pocket

あるRailsアプリがあって、そのサブドメインを別のRailsアプリとして切り出したいということがあります。

http://example.com/app1
http://example.com/app2

というように複数の独立したサブディレクトリで動かすのはよくあります。

今回の要件は例えば、app1というRailsアプリが

http://example.com/

というURLでうごいているときに、別のapp2を

http://example.com/app2

というサブディレクトリで動かしたいときです。

app2をサブディレクトリに対応

assetsやルーティングパスがサブディレクトリに対応できるように設定しておきます。

config/environments/production.rb あたりで環境変数に設定します。

Rails.application.configure do
  ENV["RAILS_RELATIVE_URL_ROOT"] = "/app2"
  Rails.application.config.relative_url_root = "/app2"

config.ruでrailsアプリ起動時にサブディレクトリを指定します。

map ActionController::Base.config.relative_url_root || "/" do
  run Rails.application
end

デプロイ

app1を

/var/rails/app1

app2を

/var/rails/app2

にデプロイします。

app1のpublicにapp2へのシンボリックリンクをはります。
シンボリックリンクはプリコンパイルしたassetsや静的ファイルの取得に必要です。

$ cd /var/rails/app1/current/public
$ ln -s app2 /var/rails/app2/current/public

Capistranoを使っている場合は、app1のshared/publicにapp2へのシンボリックリンクを作って、linked_dirsにpublic/app2を追加すればいいです。

apacheの設定

apacheとpassengerを使用している場合の設定です。

virtualhostにapp1の設定をします。
Locationディレクティブを使って、app2の設定を追加します。
PassengerAppRoot には、publicでなくapp2のルートを入れます。

<VirtualHost *:80>
  ServerName example.com
  DocumentRoot /var/rails/app1/current/public
  <Location /app2>
    PassengerBaseURI /
    PassengerAppRoot /var/rails/app2/current
  </Location>
</VirtualHost>

apacheを再起動すれば完了です。

LINEで送る
Pocket

コメントを残す