RailsでWikiクローンを作る12
production環境
既出の通り、Rails には実行時環境として development, production, test の三つの環境があります。今まで、WEBrickベースのWebサーバで開発を行って きた環境は development 環境でした。次は、実際にアプリケーションとして 本番運用する production 環境について考えます。
Webサーバの選択
Railsは、CGIをサポートした大抵の Webサーバで動かすことができますが、速 度や実績を考えると、おおよそ次のような選択肢に絞られます。
- WEBrick
- WEBrick は Ruby のみで書かれており、Ruby 1.8 系には標準添付されていることもあって手軽に動かすことができます。開発時には最適なWebサーバと言えます。反面、速度やスケーラビリティの性能面はあまり良くありません。
- Apache(CGI)
- Railsアプリケーションは、もちろんApache上で動かすこともできます。しかし Railsでは、CGI起動時のコストが極めて大きくなってしまうため、通常のCGIとして動かすのはまったくお奨めできません。
- Apache(fastcgi)
- CGIの問題点は、リクエストごとに毎回Railsのプロセスを立ち上げるため、起動コストが大きいことです。Apache で mod_fastcgi を使うと、必要なプロセスを事前に立ち上げて常駐しておけるため、この問題を解消できます。性能面ではお奨めできるのですが、反面、国内のレンタルサーバでは fastcgi に対応しているところはほとんどないので、自前でWebサーバを立てられる人向けです。
- lighttpd(fastcgi)
- lighttpdは軽量かつ高速なWebサーバです。Apache+fastcgi よりも速いと言われています。これも自前でWebサーバを立てられる人向けです。
この中で、ここでは Apache + fastcgi を選択することにします。
Apache+fastcgi
Apacheでfastcgiを使う場合、Apache 2.x 系では問題が発生することがあるよ うですので、Apache 1.3系を使うことにします (注: Apache 2.x でも問題なく動くという人もいるらしいです)。
インストールしなければいけないものは、以下の三つです。
筆者の場合は FreeBSD を使っているので、ports を使ってインストールしました。 かっこ内はFreeBSD portsでの名前です。
- Apache 1.3系 (www/apache13)
- mod_fastcgi (www/mod_fastcgi)
- Ruby/fcgi (www/ruby-fcgi)
httpd.confの設定
次に httpd.conf の設定をします。 まず、mod_fastcgiを読み込むため以下の2行が含まれていることを確認し、なければ追加します。
LoadModule fastcgi_module libexec/apache/mod_fastcgi.so AddModule mod_fastcgi.c
続いて Directory と fastcgi の設定を行います。 httpd.conf の末尾に以下を追記します (ServerName や、各パスは適切なものに変更してください)。
<VirtualHost *:80>
ServerName www.minkiwiki.org
DocumentRoot /usr/local/www/minki/public
<Directory /usr/local/www/minki/public>
AllowOverride all
</Directory>
</VirtualHost>
<IfModule mod_fastcgi.c>
FastCgiIpcDir /tmp/fcgi_ipc
FastCgiServer /usr/local/www/minki/public/dispatch.fcgi \
-initial-env RAILS_ENV=production \
-processes 15 -idle-timeout 60
</IfModule>
Railsアプリケーションでは VirtualHost を使うことを基本としていて、アプ リケーションの public ディレクトリを DocumentRoot に指定することになっ ています。
ここでは、/usr/local/www/minki に minki のアプリケーションディレクトリ を配置することにします。すると DocumentRoot は /usr/local/www/minki/public になります。また、 /usr/local/www/minki/public に対して AllowOverride all を指定していま す。
その次の部分は fastcgi の設定です。 FastCgiServer によって minki の public ディレクトリにある dispatch.fcgi を指定しています。これにより Apache起動時に、必要な Rails プロセスも起動して常駐します。また、
-initial-env RAILS_ENV=production
によって環境変数を設定し、production 環境にしています。
.htaccess
次に minki の public ディレクトリにある .htaccess を変更します。
デフォルトでは Apache の CGI 用になっているので、fastcgi 用にするため に変更します。 といっても変えるのは一行だけで、
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
という行を
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
にするだけです。
permission
Railsが動作中に書き込むディレクトリやファイルは、apache を動かしている ユーザ(wwwなど)で書き込み可能になっていなければなりません。
具体的には、まず log ディレクトリです。上記の httpd.conf の例で言うと
/usr/local/www/minki/log
を apache のユーザで読み書き可能な permission に設定します。
SQLite を使う場合は、SQLite のデータベースファイルも、apache のユーザ から読み書き可能でなければなりません。
database.yml
database.yml に production 環境用の設定をします。config/database.yml に以下の内容を追加します。
production: adapter: sqlite3 dbfile: /usr/local/www/minki/db/minki.db
production 環境では、dbfile はフルパスで書いておくのが無難です。 また、前述の通り、この db ファイルは apache を動かしているユーザから読 み書き可能にする必要があります。
以上の設定後、apache を起動し ServerName で指定した名前でアクセスすれ ば、Minki アプリが動くはずです。
VirtualHostを使わない方法
Railsアプリケーションは、VirtualHost を使わずに動かすことも可能です。 やらなければならないことは、単にアプリケーションを動かしたいディレクト リから、minki/public にシンボリックリンクを張るだけで OK です。
たとえば、minki を以下のようなサブディレクトリで動かすとすると、
http://www.example.com/minki/
DocumentRoot に、minki という名前で minki/public にシンボリックリンク を張ります。
まとめ
Apache + fastcgi で、VirtualHost を使って動かす手順は以下の通りです。
- Apache, mod_fastcgi, Ruby/fcgi をインストールする。
- httpd.conf を編集して VirtualHost や FastCGI の設定を追加する。
- public/.htaccess を FastCGI 用に変更する。
- log ディレクトリを apache を動かしているユーザで書き込み可能な permission にする。
- SQLite を使う場合は、データベースファイルも apache を動かしているユーザで読み書き可能にする。
- config/database.yml に、production 環境用データベースの設定を追加する。
- apache を再起動する。

Keyword(s):
References:[RailsでWikiクローンを作る] [Minkiダウンロード]