FrontPage  Index  Search  Changes  RSS  Login

[Ruby] Passenger

用語

VSZ

Virtual Memory Size(仮想メモリサイズ)の略称。プロセスが確保しているメモリの量を意味する。

RSS

Resident Set Size(常駐メモリサイズ)の略称。VSZのうち、実際に使用している物理メモリの量を意味する。

ロバスト

頑健さのこと。ロバストテストは、故障に関するテストの事だろうか。

FAQ

メモリリークに見えるが

おそらくはメモリリークではなく、スタックサイズの設定が影響しているもの。pstopコマンドが知らせるapacheのVSZが、異常に高い数値に跳ね上がる事がある。

  • ulimit -aを実行してスタックサイズを確認してみる
  • ulimit -s <size>を実行してスタックサイズを変更してみる
    • Passengerに関しては2MBもあれば十分で、8MB以上は不要なはず

どの程度のパフォーマンスか

おおむね、Mongrel以上、Thin同等。

ただし、絶対的な速度が目指すゴールではなく、利便性、低コストのメンテナンス性、安定性が最優先の目指すべきゴール。もちろん、十分なパフォーマンスを発揮させるために十分な努力はする。

ほかのフレームワークでも使えるのか

使えない。

ほかのフレームワークをぶち壊すという目的があるから、、、という訳ではなく。

まずは、バージョン1.0で先に挙げたゴールを達成するために、的を絞って開発しているということ。

将来的なバージョンでどうなるかはわからなくて、議論を進めているところ。

mod_rubyじゃないのか

誰もメンテナンスしてないし、プロダクトレベルで誰も使っていないし、Railsにとって嫌な制約を課すし。

mod_rubyはApacheプロセスの中でインタプリタを共有する。つまり、Railsを共有する。異なるプロダクト間でモデルを共有してしまったら、予期できない(予期できる)問題が発生するのは明白。

安定しているのか

大量の負荷テストを実施した。高負荷状態でもPassengerはクラッシュしていない事実がある(ab -n 10000 -c 100)。

ロバストテストも同様(http://ninh.nl/blog/2008/04/07/robustness-comparison-between-phusion-passenger-thin-ebb-and-mongrel/)。

Valgrindによるコードベースへの広範囲なテストも実施していて、ひどいバグの記憶がない。

1つのRailsアプリケーションがクラッシュしたら何が起きるのか。Apacheもダウンするのか。

Apacheはまったく影響を受けない。クラッシュしても、基本的にはそのドメインに対する次のアクセス時に、何事もなかったかのようにリスタートする。

ページキャッシュはサポートしているのか。スタティックコンテンツへの配慮は。

ページキャッシュはmod_rewriteの設定なしに完全にサポートしている。

スタティックコンテンツはRailsのスタックを経由せずにApacheがダイレクトに供給する。

Valgrind

動的解析ツールを作るための計器開発フレームワーク。

大量のメモリ管理やスレッド関連のバグを自動検出したり、プログラムを詳細に分析することができる。

  • 生産品質に関するツール
    • メモリエラー検出
    • スレッドエラー検出
    • キャッシュと分岐予測の分析
    • キャッシュ分析が生成するコールグラフ
    • ヒープ分析
  • 試験用ツール
    • データ競合検出
    • メモリリーク検出

GPLv2によるオープンソース。

ユーザーガイド

対象プラットホーム

以下、テスト済み。

  • Ubuntu Linux 6.06 (x86)
  • Ubuntu Linux 7.10 (x86)
  • Debian Sarge (x86)
  • Debian Etch (x86)
  • Debian Lenny/Sid (x86)
  • CentOS 5 (x86)
  • Red Hat Enterprise Linux 5 (x86)
  • Gentoo, March 14 2008 (AMD64)
  • FreeBSD 6.1-RELEASE (x86)
  • MacOS X Tiger (x86)
  • MacOS X Leopard (x86)

基本的に、POSIXに従ったOSであれば動作する。つまり、Windows以外は動くはず。

インストール手順

  • ソースコードのtarボールをダウンロードしてインストールする
  • gemを利用してインストールする(簡単)

場合によっては、apxsのパスを指定する必要がある事に注意する。

export APXS2=/opt/apache2/bin/apxs

システムによっては、apxs2という名前かもしれない事に注意する。

同様に、rubyのパスをPATHに含めておく事。

export PATH=/opt/myruby/bin:$PATH

gemを利用する場合

gem install passenger-x.x.x.gem
passenger-install-apache2-module

tarボールを利用する場合

cd /path/to/install_base
tar xzvf ~/YourDownloadsFolder/passenger-x.x.x.tar.gz
/opt/passenger-x.x.x/bin/passenger-install-apache2-module

展開したところがインストール先のベースになる事に注意する。

展開したディレクトリはApacheがアクセス可能である必要があるので、インストール後に消さないこと。

デプロイ

  • バーチャルホストのルートや任意のパスにRailsアプリケーションを割り当てられる
  • 環境変数RAILS_ENVは標準でproduction
    • 設定オプションRailsEnvを使って任意に変更できる

バーチャルホスト

<VirtualHost *:80>
    ServerName www.mycook.com
    DocumentRoot /webapps/mycook/public
</VirtualHost>

任意のパス

  • Railsアプリケーションに''http://www.phusion.nl/rails''でアクセスする場合
    • symlinkを利用してアプリケーションのpublicディレクトリをドキュメントルートにつなげる
  • 設定オプションRailsBaseURIを使ってベースとなるパスを設定する
<VirtualHost *:80>
    ServerName www.phusion.nl
    DocumentRoot /websites/phusion
    RailsBaseURI /rails
</VirtualHost>
$ ln -s /webapps/mycook/public /websites/phusion/rails

デプロイとアプリケーションの再起動

アプリケーションをアップデートする場合、必要なファイルの更新とアプリケーションの再起動が必要。

アプリケーションの再起動には以下の2通りの方法がある。

  • Apacheを再起動する
  • tmp/restart.txtを作成するか更新すると自動的にアプリケーションが再起動される
$ touch /webapps/mycook/tmp/restart.txt

Passengerの設定

RailsSpawnServer

RailsSpawnServer <filename>

Passengerのスポーンサーバの位置。

指定されなければ環境変数PATHを使って、passenger-spawn-serverを探してくれる。

グローバル設定で行う。

RailsBaseURI

RailsBaseURI <uri>

アプリケーションごとのベースURIを設定する。

グローバル設定やバーチャルホスト設定で行う。

RailsAutoDetect

RailsAutoDetect <on|off>

標準で、PassengerはバーチャルホストのドキュメントルートがRailsアプリケーションであると判断する(デフォルトでon)。

グローバル設定やバーチャルホスト設定で行う。

以下の例では、http://www.mycook.com/''にアクセスした際、Railsアプリケーションの出力の代わりに、/webapps/mycook/public''にあるコンテンツが返される。

RailsAutoDetect off
<VirtualHost *:80>
    ServerName www.mycook.com
    DocumentRoot /webapps/mycook/public
</VirtualHost>

以下のようにRailsBaseURIを使用して、Railsアプリケーションの位置を明示する事ができる。

RailsAutoDetect off
<VirtualHost *:80>
    ServerName www.mycook.com
    DocumentRoot /webapps/mycook/public
    RailsBaseURI /
</VirtualHost>

RailsAllowModRewrite

RailsAllowModRewrite <on|off>

このオプションを有効にすると、mod_rewriteを上書きしなくなる(後述)。デフォルトでoff

グローバル設定やバーチャルホスト設定で行う。

RailsRuby

RailsRuby <filename>

利用するRubyインタプリタを指定できる。デフォルトでruby

グローバル設定で行う。

RailsEnv

RailsEnv <string>

RAILS_ENVに指定したい値を設定できる。デフォルトでproduction

グローバル設定で行う。

アプリケーションごとに変更したい場合は、config/environment.rbの中で設定する事。

RailsMaxPoolSize

RailsMaxPoolSize <integer>

同時に活動可能なRailsアプリケーションのインスタンスの最大数。デフォルトは20個。

最適な値はシステムのハードウェアやサーバのロードアベレージに依存する。

一般的な方針をいかに挙げる。

  • CPU(コア)の数と同数
  • メモリが2GB程度あるなら、30を推奨
  • VPSでメモリを256MB程度割り当てられているなら、2を推奨
    • もしくはMySQLのようなほかのサービスが起動している場合も同様

グローバル設定で行う。

※決定する際は、実験を行うべき

RailsPoolIdleTime

RailsPoolIdleTime <integer>

Railsアプリケーションのインスタンスが待機している秒数の最大値。デフォルトは120秒。

最適な値は、あるRailsアプリケーションについて、ある訪問者が費やす時間の平均に依存する。推奨は、訪問者が費やす時間(秒数)を2倍した数値。

グローバル設定で行う。

RailsUserSwitching

RailsUserSwitching <on|off>

ユーザ切り替えをサポートする。デフォルトはon

グローバル設定で行う。

RailsDefaultUser

RailsDefaultUser <username>

ユーザ切り替えが有効なら、Railsアプリケーションを実行可能なユーザを指定する事ができる。

グローバル設定で行う。

トラブルシューティング

  • OS固有
    • OSXのMAMPについて
  • インストール時
    • Rubyの開発用ヘッダがない場合
    • APacheの開発用ヘッダがない場合
    • APRの開発用ヘッダがない場合
    • Passengerが間違ったApacheを使おうとする
    • Passengerが間違ったRubyを使おうとする
  • インストール後
    • Passengerが間違ったApacheでコンパイルされる
    • 304 Forbiddenエラー
    • スタティックコンテンツが表示できない
    • Apacheエラーログにスポーン管理スクリプトがないなどのメッセージが記録される
    • Railsアプリケーションがパーミッションエラーで起動できない
    • Railsアプリケーションのログが書き込めない
  • Apacheモジュールとの衝突
    • mod_rewriteとmod_alias
    • mod_userdir
    • VirtualDocumentRoot

mod_rewriteとmod_alias

Passengerはmod_rewriteとmod_aliasと衝突する。

Railsアプリケーションを含むバーチャルホスト内でこれらのモジュールを併用する事は推奨できない。バーチャルホストの外ではうまく動くかもしれない。

標準で、PassengerはRailsホストのmod_rewriteルールを上書きする。Railsの標準では、.htaccessを使ってdispatch.cgiにリライトするルールが書かれており、これが非常に遅い処理であるため、「そのまま使える」という重要な目標のためにこのような対策を行っている。

mod_aliasに関する説明がなされていないが、バーチャルホストのRailsアプリケーションと組み合わせたとき、大変な問題が発生するとの事。

mod_rewriteを使いたい場合、RailsAllowModRewriteを使えばよい。ただし、先述の問題を回避するために、.htaccessを削除するかリライトルールを書き換える必要がある。

tipsと注意事項

ユーザ切り替え(セキュリティ対策)

PHPでよくみられるように、別人のアプリケーションであっても、すべて同じユーザで実行される問題がある。Passengerでは、この問題をユーザ切り替えによって解決している。

Railsアプリケーションは、config/environment.rbの所有者(owner)によって起動される。

  • environment.rbの所有者はRailsアプリケーション全体について読み込み権限が必要
    • さらに、logsディレクトリへの読み込み/書き込み権限が必要
  • この機能はApacheがrootによって起動されたときのみ有効
  • Railsアプリケーションをrootで起動可能な環境でない場合
    • environment.rbの所有者がrootか不明なユーザなら、RailsDefaultUserで指定されたユーザで起動される

Ruby Enterprise Edition

メモリ消費量が平均33%減少した。

インストール済みPassengerの移動

ディレクトリを移動

$ mv /opt/passenger /usr/local/passenger

設定オプションRailsSpawnServerを変更

RailsSpawnServer /usr/local/passenger/bin/passenger-spawn-server

複数の異なるRailsの利用

$ gem install rails -v X.X.X

Passengerは自動的に適切なバージョンを使う?

X-Sendfile

Passengerは標準ではX-Sendfileをサポートしないので、mod_xsendfileをインストールする事。

  • mod_xsendfilehttp://tn123.ath.cx/mod_xsendfile/
Last modified:2008/06/01 00:10:03
Keyword(s):
References: