WebOS Goodies

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

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

Apache リバースプロキシ→ Lighttpd + Rails の設定方法

今週はあまり時間がないので、 Rails 関連の Tips でお茶を濁すことにします。

以前投稿した Apache のリバースプロキシの設定方法という記事では、 Apache ベースのサイトの一部として Rails アプリケーションを公開する方法をご紹介しました。今回はその mongrel を Lighttpd で置き換え、 Apache → Lighttpd + Rails という構成にする設定をご紹介します。まあ、仕事でやった作業の覚え書きです。

Lighttpd ならパフォーマンスも出るので、一般公開するサイトでもじゅうぶんに使える方法です。 Apache で運用しているサイトに Rails アプリケーションを組み込みたいという際は、参考にしていただければと思います。

なお、 Lighttpd や Ruby fcgi ライブラリのインストールは OS のパッケージ管理コマンド等で一発だと思いますので、それらは割愛して設定方法のみをご紹介しています。ご了承ください。

lighttpd.conf を自動生成

Lighttpd を使って Rails アプリケーションを起動するには、 lighttpd.conf を適切に設定する必要があります。ただ、 lighttpd.conf の記法はけっこう独特なので、慣れていないとなかなか面倒です。しかし、心配ご無用。 Rails には lighttpd.conf の基本的な設定を自動生成する機能があります。今回はそれを使ってみましょう。

そのためには、まず lighttpd の実行ファイルにパスを通しておきます。多くの場合 /usr/sbin あたりにインストールされるので、一般ユーザーではパスが通っていないことが多いのです。

export PATH=/usr/sbin:$PATH

あとは、 RAILS_ROOT をカレントにして以下のコマンドを実行するだけ。

cd $RAILS_ROOT
./script/server lighttpd

こうすると、 ./script/server は WEBRick の代わりに Lighttpd を使って RAILS を起動します。しかも、その際に設定ファイルを config/lighttpd.conf に保存してくれるので、あとはこれをテンプレートにして必要な設定を追加すれば良いわけです。

2008/12/8 修正
mongrel がインストールされているとそちらが優先されるようなので、 lighttpd を明示的に指定するようにしました。

lighttpd.conf を修正する

それでは lighttpd.conf に必要な修正を加えます。今回は以下の設定をすることにしましょう。

  • 待ち受けポート番号は 8080 。
  • /rails を Rails アプリケーションのトップ URL とする。
  • Rails の動作モードは production モード。

この前提だと、 lighttpd.conf の以下の部分に修正を加えれば OK です(変更のある部分のみを抜き出しています)。赤字の部分が追加・修正する記述です。

server.port = 8080
server.modules += ( "mod_alias" )
alias.url = ( "URL上のルートパス" => CWD + "public/" )
fastcgi.server      = ( ".fcgi" => ( "localhost" => (
  "min-procs"       => 1,
  "max-procs"       => 1,
  "socket"          => CWD + "/tmp/sockets/fcgi.socket",
  "bin-path"        => CWD + "/public/dispatch.fcgi",
  "bin-environment" => ( "RAILS_ENV" => "起動モード" ),
  "strip-request-uri" => "/rails"
) ) )

もし起動に必要な環境変数があれば、 bin-environment にコンマ区切りでいくつでも指定できます。また、パフォーマンスを出すにはプロセス数なども適切に調整する必要があるでしょう。そのあたりは Lighttpd 自身の解説を参照してください。

Rails が生成するパスを補正する

以上で Lighttpd 側の設定は終了ですが、 Rails の link_to などが生成するパスは Rails のトップディレクトリがサイトのルートであることを仮定していますので、このままでは、それらのすべてがリンク切れになってしまいます。 mongrel にはこれを補正するオプションがありましたが、残念ながら Lighttpd にはそのような便利機能はないので、 Rails 側で補正しなければなりません。

といっても方法は簡単、 config/environment.rb の最後のあたりに以下の行を追加するだけです(Rails 2.0 の場合)。

ActionController::AbstractRequest.relative_url_root = '/rails'

上記はやり方は Rails 2.1 で deprecated になったようで、代わりに Rails::Initializer.run 内に以下の行を書く方法が推奨されています(実際には試していないので、間違っていたらすいません)。

config.action_controller.relative_url_root = '/rails'

お使いのバージョンに合わせて適切な方で設定してください。

Lighttpd を起動する

これで Lighttpd + Rails の設定が終了しました。 -d オプション付きで ./script/server を起動すれば、 Lighttpd で Rails が起動するはずです。 lighttpd にパスを通しておくのを忘れないでください。

cd $RAILS_ROOT
./script/server lighttpd -d

ブラウザで "http://localhost:8080/rails/" にアクセスし、アプリケーションが動作することを確認してください。

実運用でも ./script/server でじゅうぶんかもしれませんが、もし init スクリプトで起動したい場合は、 config/lighttpd.conf を /etc/lighttpd/lighttpd.conf あたりにコピーしてしまうのが良いでしょう。その際、 CWD は実際のパスに置き換える必要があると思います。

いずれの場合でも、サーバーを落とすには Lighttpd のプロセスを kill するしかないようです。 tmp/pids/lighttpd.pid にプロセスIDが記録されているので、スクリプトを作ってしまうのが吉です。

#! /bin/bash
 
PID=/path/to/rails_root/tmp/pids/lighttpd.pid
if [ -f $PID ] ; then
  kill `cat $PID`
fi

もし Lighttpd を落とすもっと良い方法があったら、ぜひ教えてください(^^;

Apache のリバースプロキシの設定

Lighttpd をメインにして運用するならこれで作業完了なのですが、さまざまな事情で Apache が外せない場合もあります。そんなときはリバースプロキシで Apache から Lighttpd にリクエストを投げてやることで対処できます。方法はApache のリバースプロキシの設定方法で詳しくご紹介しましたが、今回の条件なら httpd.conf に以下の行を追加してやるだけです。

ProxyPass /rails http://localhost:8080/rails
ProxyPassReverse /rails http://localhost:8080/rails

その後 Apache を再起動すれば、無事 Apache ベースのサイトに Lighttpd + Rails を統合できます。

以上、本日は Lighttpd で Rails アプリケーションを立ち上げ、 Apache からリバースプロキシをかける方法をご紹介しました。最近では Rails を効率よくハンドルできる Web サーバーも増えてきましたが、実績からくる安心感では、やはり Lighttpd に一日の長がありますね。上記のように設定も簡単なので、積極的に活用していきましょう。

関連記事

この記事にコメントする

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