14 10月 2015
Railsアプリのサブディレクトリで別Railsアプリを運用
ある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を再起動すれば完了です。