Ruby on Railsのアプリをサブディレクトリで動かす方法

Ruby on Railsのアプリをサブディレクトリで動かす方法

みなさんこんにちは、意識高い系エンジニアの僕です。

先日1つのサーバで複数のRails環境をサブディレクトリで動かすということをしたのですが、
そのときのメモを公開したいと思います。

対象バージョン

  • Ruby 2.2.2
  • Rails 4.2.1
  • CentOS 6.4
  • Apache 2.2.15
  • Passenger 5.0.6
  • Capistrano 3.4.0

Railsのアプリをサブディレクトリで動かす場合、Rails.application.config. relative_url_rootを設定することで実現できます。

relative_url_rootとは

Railsにはルートディレクトリを変更できるrelative_url_rootという値があます。
環境変数であるENV[“RAILS_RELATIVE_URL_ROOT”] を設定することでrelative_url_rootに設定したパスが格納され、サブディレクトリでの動作が可能になります。

サーバ側の設定

例えばApache+Passengerで動かしている場合、必要な設定は大きく分けて以下の2つです

  • PassengerBaseURI
  • AssetsPipelineの環境変数設定

PassengerBaseURIに指定した内容がRails側のrelative_url_rootに渡される仕組みになっているようです。
しかしPassengerBaseURIはあくまでアプリケーションサーバの動作に影響をあたえるものなので、AssetsPipelineの側は別で設定する必要があります。

PassengerBaseURIの設定

httpd.confのバーチャルホストの設定に以下のように設定します

<VirtualHost *:80>
    RackEnv dev
    ServerName dev.example.co.jp

    DocumentRoot /home/hoge/dev.example.co.jp/current/public
    <Directory /home/hoge/dev.example.co.jp/current/public>
        AllowOverride all
        Options -MultiViews
        PassengerBaseURI /subdir
        PassengerAppRoot /home/hoge/dev.example.co.jp/current
    </Directory>
</VirtualHost>

assets pipelineの設定

これは主に本番環境などで必要になるものですが、assets pipeline でプリコンパイルする場合には当然Passengerの設定とは別に環境変数を設定してやる必要があります。
例えばCapistranoを使ってデプロイしている場合、デプロイ設定のdeploy.rbに以下の1行を追加します。

set :default_env, { 'RAILS_RELATIVE_URL_ROOT' => '/subdir' }

これでassetsも相対パスで読まれるようになります。

CSSで指定している画像などが正しく読み込まれない場合

CSSでバックグラウンド画像など指定するところがimage-urlが使われていないせいで画像が出ないなどということもありますので、その場合にはCSS側でimage-urlが使われているか確認してみるのもいいと思います。

ルーティングはどうなっているのか

以下のように環境変数を渡してルーティングを確認してもパスにサブディレクトリはついていません。

RAILS_RELATIVE_URL_ROOT=/subdir bundle exec rake routes

しかしhoge_example_pathなどのUrlHelperを使った場合でも正しくサブディレクトリが含まれたパスを返してくれます。
もし特定のリンクのみサブディレクトリを含めたくないなどの場合は、以下のようにscript_nameを明示的に変更してやればRAILS_RELATIVE_URL_ROOTが除外された状態でパスを生成できます。

hoge_example_path(script_name: '/')

ローカル環境にてサブディレクトリで動かす場合

ローカル環境のWebrickなどで動かす場合はconfig.ruへの設定と、サーバ起動時に環境変数を渡すことで対応できます。

config.ruの設定

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
map ActionController::Base.config.relative_url_root || "/" do
    run Rails.application
end

サーバ起動コマンド

以下のようにRAILS_RELATIVE_URL_ROOTを渡してやります

RAILS_RELATIVE_URL_ROOT=/subdir bundle exec rails s -b 0.0.0.0

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。