Railsアプリのデプロイ

前置き

本サイトのwebサーバはapache2ですが、apache2とrailsをつなげるために、passengerとrackを使っています。

 apache2 → passenger → rack → rails

rackは、様々なwebサーバと様々なrubyベースのwebアプリとの中継役です。rackのインターフェイスに準拠したものなら、どんなwebサーバやwebアプリでもつなげることができます。一方passengerは、apache2をrailsアプリやrackアプリとつなげるための拡張モジュールです。passengerを直接(つまりrackを経由せずに)railsとつなげることもできるので、rackはoptionalです。

さて、railsでは、アプリごとに3つのDB(開発用、テスト用、本番用)を使い分けることができるようになっています。railsアプリの開発中は開発用DB(development)を使い、一般公開するときは本番用DB(production)を使います。本記事では、開発用DBから本番用DBへ切り替える方法を説明します。

本文

apache2/passengerのコンフィグ

apache2へpassengerモジュールを追加したとき、見よう見まねで、Directoryディレクティブを下記のように設定しました。

<Directory "/path/to/the/rails/app">
  RackBaseURI /rails
  RackEnv "development"
  ... 以下省略
</Directory>

いかにも、RackEnvを"production"に変えればRailsアプリを本番環境へ移行できそうに見えます。ググってみても、そのような記述が見つかります。しかし、なぜか私の環境ではダメでした。設定ファイルを変更してapache2を再スタートさせても、開発用DBを使い続けてしまいます。

<Directory "/path/to/the/rails/app">
  RackBaseURI /rails
  RackEnv "production"
  ... 以下省略
</Directory>

似たようなオプションとしてRailsBaseURIとRailsEnvも用意されていますが、これらは、rackを経由せずにpassengerとrailsを直接つなぐためのオプションなので、本サイトでは使っていません。

結局、apache2やpassengerのコンフィグによってDBを切り替えることはできない、というのが私の結論です。ゞ

[補足] 後日、rack無しの状態でRailsBaseURIとRailsEnvを使ってみたところ、無事、RailsEnvを書き換えることによってDBを切り替えることができました。rackを使わない場合は、passengerのコンフィグによってDB切り替えが可能です。

railsアプリのコンフィグ

そもそもrailsアプリのDBを切り替えるには、環境変数RAILS_ENVを使います。前述のRackEnvに連動して、passengerかrackがRAILS_ENVを設定してくれるものだと思っていましたが、そうではないようです。そこで、自分でRAILS_ENVを設定します。

railsでアプリを新規作成すると、アプリディレクトリの下のconfigディレクトリに様々なコンフィグファイルが自動生成されます。そのひとつ、config/environment.rb にRAILS_ENVの設定を追記しました。

  • config/environment.rb
# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION

ENV['RAILS_ENV'] ||= 'production'

# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')

boot.rbのrequireよりも前に書くのが重要です。これが推奨される方法なのか確信はありませんが、私の環境ではうまくいっているようです。

railsアプリの再起動

ここからは余談です。開発用の環境ではブラウザからのリクエストが来るたびにrailsアプリが再ロードされますが、本番環境ではそんな無駄なことはしません。しかし上記のようにrailsのコンフィグファイルを変更したときは、それを反映させるためにrailsアプリを再ロードする必要があります。

apache2を再スタートするのが最もstraightforwardな方法ですが、passenger環境の場合はもっと簡単な方法があります。アプリディレクトリの下の、tmp/restart.txtをtouchして下さい。

 $ touch tmp/restart.txt

ロードした時刻よりもrestart.txtのタイムスタンプが新しい場合、passengerはrailsアプリを再ロードしてくれます。

Last modified:2010/05/26 15:21:22
Keyword(s):
References:
This page is frozen.