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
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境