UnicornでRedmineをサブディレクトリにデプロイする方法

半年以上ぶりの記事ですね。

最近ちょっとはまってしまったので、備忘録です。
Apache + Unicorn + Redmineという構成で、Redmineをサブディレクトリへデプロイする方法を、”/redmine”にデプロイする場合を例にとって説明します。

サブディレクトリへのデプロイに関する公式なWikiは以下なのですが、記事掲載時点の内容でUnicornについて言及されておらず、単純にはうまくいきません。
http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI
検索してもこの組み合わせの正しい情報が上位に来ないので、メモを残します。

なお、本内容はRedmineだけではなく、他のRailsアプリの場合も同様です。

前提:

  • UnicornでRedmineが起動できる状態
  • Apacheはmod_proxy, mod_proxy_httpが組み込まれている状態

テスト環境:

  • OS: Ubuntu 12.04 LTS x64
  • Apache 2.2.22
  • Unicorn 4.6.2
  • Redmine 2.3.1

やりかた:

まず、Redmineのディレクトリにあるconfig.ruを編集します。

#run RedmineApp::Application
if ENV['RAILS_RELATIVE_URL_ROOT']
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run RedmineApp::Application
  end
else
  run RedmineApp::Application
end

そして、Unicornを--path /redmineオプション付きで起動します。
ここでは、Unicornの起動ファイルはconfig/unicorn.rbにあると仮定し、productionモードでデーモン化して起動しています。

cd /path/to/redmine
bundle exec unicorn_rails -D --path /redmine -c config/unicorn.rb -E production

最後に、Apacheの設定はmod_proxyを使って以下のように書きます。
ここでは、Unicornが動いているホスト:ポートをlocalhost:3000とします(上記のconfig/unicorn.rbに記載されている)。

<VirtualHost *:80>
  *SNIP*
  ProxyPass /redmine http://localhost:3000/redmine
  ProxyPassReverse /redmine http://localhost:3000/redmine
  *SNIP*
</VirtualHost>

最後にApacheの設定を再読込すれば終了です。

解説:

bundle exec unicorn_rails -D --path /redmine -c config/unicorn.rb -E production

--path /redmineの意味ですが、
これは、「環境変数RAILS_RELATIVE_URL_ROOTに”/redmine”を設定して起動する。」の意になります。
Railsはこの環境変数が設定されていると、config.action_controller.relative_url_root=”/redmine”として振る舞います。
これは、ActionController::Base.relative_url_root=”/redmine”と等価です。
で、ActionController::Base.relative_url_rootは何をしてくれるかというと、静的リンク生成時、その相対パスを考慮してくれるようになります。

次に、config.ruの編集の意味です。
config.ruはRackアプリケーションの定義スクリプト(Rubyコード)です。
RedmineはRailsアプリであり、RailsアプリはRackアプリです。
Rackアプリはmapメソッドでそのパスに一致する場合の処理を書くことができます。
ここで、ENV[‘RAILS_RELATIVE_URL_ROOT’]がある場合は、そこで指定された相対パスに対して、アプリを関連づけて処理します。
こうしないと、ルーティングの解釈が”/”からになってしまい、/redmineは存在しなくなります。
“/”にアクセスすると、静的リンクは”/redmine”が使われ、動的リンクは”/”から始まるというちぐはぐな状況が生まれます。
なお、Unicornは、config.ruがなければ、–pathだけでスクリプトの変更に相当した作業を実施してくれます。

そして、最後のApacheの設定です。
これは、Apache側の/redmineに来たリクエストを、Unicornで立てているhttp://localhost:3000/redmineにリダイレクトするようにする定義です。

これによって、http://localhost/redmine/ へのアクセスが、ttp://localhost:3000/redmine/にリダイレクトされ、
Unicornはhttp://localhost:3000/redmineで正しく待ち受けているので、正しく処理されるということになります。

Nazy の紹介

A software engineer.
カテゴリー: Ruby, 未分類 タグ: , , , パーマリンク