WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Ruby on Rails : Apache で動作させる

またまた間が空いてしまいました。本日は Apache で構築された Web サーバーで Ruby on Rails アプリケーションを稼動させる方法をご紹介しようと思います。個人的な用途なら WEBrick でもじゅうぶんに使えるのですが、処理効率やセキュリティーが重要になる場面では Apache (もしくはその他の Web サーバー)を使用するほうが適切でしょう。 Ruby on Rails でインターネットに公開するアプリケーションを作ろうという方は、ぜひ読んでみてください!(^^)

プロジェクトの配置

これまでは手抜きで "~/blognavi" をプロジェクトディレクトリとしてきましたが、このままでは Apache からアクセスするのにいろいろと問題がありますし、管理も面倒です。そろそろプロジェクトディレクトリを適切な場所に移動しましょう。ただし、プロジェクトディレクトリの配置方法は千差万別、条件によって適切な方法は異なります。ここでは私がやった方法をそのままご紹介しますが、実際の配置にあたっては皆さんの環境に合わせてアレンジしてください。

ディレクトリ構造の決定

Ruby on Rails アプリケーションを Apache などで公開する場合のポイントはただひとつ、「"public" ディレクトリのみを公開し、他のディレクトリは決して公開しない」です。 クライアントから直接アクセスされるべきファイルはすべて "public" ディレクトリに集められていますので、それ以外のディレクトリを公開してもセキュリティーを低下させるだけです。必ずプロジェクトディレクトリはドキュメントルートの外に置き、 "public" ディレクトリのみを公開しましょう。

ドキュメントルートの外にある特定のディレクトリを公開する方法はいくつかありますが、もっとも簡単なのはシンボリックリンクを使うことです。プロジェクトディレクトリはドキュメントルートの外に置き、ドキュメントルートの下に "public" フォルダへのシンボリックリンクを作成すれば、 "public" ディレクトリのみを公開できます。

実際のディレクトリ構成は以下のようにしました。

var
 `-www
    `-localhost
       |-htdocs           ドキュメントルート
       |  |-rails
       |  |  `-blognavi   /var/www/localhost/rails/blognavi/public へのシンボリックリンク
       |  `-...
       `-rails
          `-blognavi      blognavi のプロジェクトディレクトリ
             |-public
             `-...

GentooLinux では "/var/www/<ホスト名>" に各バーチャルホストのデータを格納することになっています。ここではホスト名は "localhost" を前提とします。ドキュメントルートはその下の "htdocs"、つまり "/var/www/localhost/htdocs" です。

まずは blognavi のプロジェクトディレクトリですが、 "/var/www/localhost" の下に "rails" というディレクトリを作り、その下に "blognavi" ディレクトリを作成してこれをプロジェクトディレクトリとしました。以下のように移動するだけでよいと思います。

mkdir /var/www/localhost/rails
mv ~/blognavi /var/www/localhost/rails

次は "blognavi/public" へのシンボリックリンクの作成ですが、ここでもドキュメントルート直下に "rails" というディレクトリを作成し、その中にシンボリックリンクを作成することにしました。

mkdir /var/www/localhost/htdocs/rails
ln -s ../../rails/blognavi/public /var/www/localhost/htdocs/rails/blognavi

こうすれば、 Ruby on Rails 用の設定を "rails" ディレクトリに限定することができます。また、別の Ruby on Rails アプリケーションを作成した際でも、 "rails" の中にシンボリックリンクを作成するだけで、新たに Apache の設定を変更する必要はありません。 URL が少し長くなってしまうのが欠点ですが、管理の手間を考えるとオススメな方法です。

ファイルパーミッションの設定

ここでプロジェクトディレクトリのパーミッションを確認しておきましょう。 apache ユーザーから "blognavi" 以下のすべてのファイルの読み取りを許可し、さらに "blognavi/log", "blognavi/tmp" のみ書き込みを許可すれば大丈夫です(以前のバージョンで作成したプロジェクトでは、 "blognavi/tmp" は存在しないかもしれません)。大抵は以下のコマンドを実行すればよいはずです。

cd /var/www/localhost/rails
chmod -R a+r blognavi
chmod -R a+w blognavi/log blognavi/tmp

万全を期すなら、 "script", "test" あたりは apache からのアクセスを禁止したほうがいいかもしれません。試していないので、ちょっと自信がありませんが(^^ゞ

Apache の設定

それでは次に、 Apache 側の設定を変更しましょう。 Ruby on Rails を動作させるために必要な設定は "blognavi/public/.htaccess" に記述されていますので、後はそれが有効になるように設定すればよいだけです。通常は "/var/www/localhost/htdocs/rails" ディレクトリに対して "Options +FollowSymLinks" と "AllowOverride All" を設定すればいけるはずです。

GentooLinux の場合、 localhost の設定は "/etc/apache/vhosts.d/00_default_vhost.conf" で行います。コメントや関係のない記述などを除くと以下のようになるでしょうか。

NameVirtualHost *:80

<VirtualHost *:80>
  DocumentRoot "/var/www/localhost/htdocs"

  <Directory "/var/www/localhost/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  <Directory "/var/www/localhost/htdocs/rails">
    Options +FollowSymLinks # 念のため
    AllowOverride All
  </Directory>
</VirtualHost>

これらの記述は場合によって違うと思いますので、あくまで参考程度に見てください。とくに、アクセス制限などをまったくかけていませんので、このままだと blognavi に誰でもアクセスできてしまいます。つまり勝手にデータベースを書き換えられてしまいます。インターネット上に公開された Web サーバーで稼動させる場合は必ず何らかの対処をしておいてください。

設定を書き換えたら、 Apache を再起動します。

/etc/init.d/apache2 restart

これで、 ApacheRuby on Rails アプリケーションを公開する準備が完了しました。

本稼動に向けての詰め

ここまでの設定で Ruby on Rails が動作する条件は整ったはずです。実際にブラウザでアクセスして動作確認しつつ、本格的な稼動に向けての詰めをしていきましょう。

CGI で動作させる

デフォルトの状態では、通常の CGI で動作する設定になっています。まずはこの状態でアクセスし、きちんと動作することを確認しましょう。 Web ブラウザを立ち上げて、 "http://localhost/rails/blognavi" にアクセスしてみてください(リモートマシンからアクセスする際は、ホスト名を適宜読み替えてください)。正常に動作していれば、 blognavi の記事リストが表示されるはずです。

しかし、現状ではアクセスしてからページが表示されるまでに、けっこう時間がかかるはずです。サーバーマシンのスペックにもよりますが、 1〜3 秒程度はかかるのではないでしょうか。通常の CGI ではアクセスされるたびに Ruby on Rails の初期化処理を行うため、サーバーへの負荷が高く、レスポンスも悪くなります。これを改善するには、次でご紹介する FastCGI という仕組みを使用します。

FastCGI で動作させる

FastCGI とは、従来の CGI の利点を維持しつつサーバーへの負荷を軽減し、レスポンスを向上させる仕組みです。 Apache で利用するには拡張モジュールのインストールなどを行わなければなりませんが、その詳細についてはこちらの記事をご参照ください。ここでは既にインストール作業が終わっていることにします。

Ruby on RailsFastCGI の機能を利用するには、プロジェクトディレクトリの "public/.htaccess" を多少変更する必要があります。まず最初はハンドラーの指定です。デフォルトでは mod_fastcgi を使用する設定になっているのですが、このモジュールは Apache 2.0 と相性が悪いので使われなくなってきています。 GentooLinux では代わりに mod_fcgid のパッケージが含まれていますので、そちらを使うように変更します。具体的には、ファイルの最初のほうにある ".fcgi" に対するハンドラーの指定を以下のように変更します。

AddHandler fcgid-script .fcgi

次に、 "dispatch.cgi" を呼び出している部分を "dispatch.fcgi" に変更します。ファイルの後半、 RewriteRule を設定している部分を以下のように変更します。

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

これで FastCGI が有効になるはずです。実際にアクセスしてみれば、レスポンスが段違いによくなったのがお分かりいただけると思います。

本番環境に移行する

以前の記事でも少し触れましたが、 Ruby on Rails では標準で「開発」、「テスト」、「実稼動」の 3 つのコンフィギュレーションが用意されており、それぞれで別々のデータベースを使用したり、キャッシュなどの設定を変えたりすることができます。このうち「実稼動」のコンフィギュレーションでは各種のキャッシュが有効になり、スクリプトの変更チェックなども省略されてサーバー負荷が最小の状態になります。もし大量のアクセスが予想されるなら、公開前に実稼働環境に切り替えて、無駄な処理を省くようにしましょう。

設定方法は、 Apache の設定ファイルの "mod_fcgid" の設定を行っている部分に、以下の記述を追加します。

DefaultInitEnv RAILS_ENV production

GentooLinux の場合は、 "/etc/apache2/modules.d/20_mod_fcgid.conf" を以下のようにすれば良いかと思います。

<IfDefine FCGID>
    <IfModule !mod_fcgid.c>
        LoadModule fcgid_module modules/mod_fcgid.so
    </IfModule>
    <IfModule mod_fcgid.c>
        AddHandler fcgid-script .fcg
        DefaultInitEnv RAILS_ENV production
    </IfModule>
</IfDefine>

この設定を行った後、 Apache を再起動すれば実稼働環境が有効になるはずです。

実稼働環境では、スクリプトを変更するたびに Apache を再起動する必要があることに注意してください。従って、開発用の環境を別に用意するなどの工夫が必要になります。 blognavi のように自分が使うだけのアプリケーションなら、開発環境のまま使用するのもひとつの手です。そのあたりは臨機応変で良いと思います。

本日は、 Apache を使用した Web サーバーで Ruby on Rails アプリケーションを公開する方法をご紹介しました。これまでは動作確認のためにいちいち WEBrick を立ち上げていましたが、 Apache で使えるようにしてしまえばその手間もなくなります。本来は、なるべく早い段階で移行するべきなのかもしれませんね(^^ゞ。また、一度上記の環境を作ってしまえば、簡単に Ruby on Rails アプリケーションを追加していくことができます。データベースのフロントエンドを手軽に構築する手段として、 Ruby on Rails を存分に活用できますね。皆さんもぜひ挑戦してみてください!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles