それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

RailsをPassengerモードで動かす。

RailsApache+Passengerで動かす。

Passengerって?

RailsもつかってるRackをApacheに組み込んじゃう感じ。

mod_rackを使えるように、mod_proxyと組み合わせて内部的にrailsプロキシしちゃう。そんな感じ

aptインストール

apt-get で入ったよ。でも動かなかった。。理由は。gem依存モジュールがaptパッケージの想定違うことによるみたい。

手動で環境作る手順

  • gem パッケージでインストール
  • apacheのapxでモジュールとしてコンパイル
  • apacheにdynamic share object (so)として組み込み
  • rails環境作る
  • Passengerでrails起動

この手順がpassenger-install-apache2-module コマンドだけに集約される。えらい。

手動インストール

gemから。

gem update --system
gem install passenger
passenger-install-apache2-module 

aptで入れたパッケージは動かなかったので。
rvm環境とかあるときは注意してね

画面の指示に従う。


画面の指示が詳細でわかりやすい。こういう気配りいいよね

指示画面のキャプチャがつぶれて見えないので。

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
   PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11
   PassengerRuby /usr/bin/ruby1.8

実際の設定

実際に設定した。

ドキュメントルートでPassengerを動かす場合

/etc/apache2/sites-enabled/air.example.jp
<VirtualHost *:80>
  DocumentRoot /var/www/air.example.jp/rails/book/public
  ServerName air.example.jp
  RailsEnv development
  <Directory /var/www/air.example.jp/rails/book/public>
   AllowOverride all
   Options -MultiViews
  </Directory>
</VirtualHost>
/etc/apache2/mods-enabled/passenger.load
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
/etc/apache2/mods-enabled/passenger.conf
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11
PassengerRuby /usr/bin/ruby1.8

ドキュメントルート以外を使う場合

ドキュメント以外のディレクトリにRailsを入れて、ディレクトリを別にする場合

<VirtualHost *:80>
  DocumentRoot /var/www/air.example.jp
  ServerName air.example.jp
  RailsEnv development
  RailsBaseURI /rails/book/public
  <Directory /var/www/air.example.jp/rails/book/public>
   AllowOverride all
   Options -MultiViews
  </Directory>
</VirtualHost>

簡単ですね。

ここまで簡単なら、自分専用に作っておいても問題ないかなーって思う。

PushionPassenger

のPhusionっての名前がすきになれない.PHPの守護神(スホンシン)パッチを思い出して・・・

この自己主張しすぎなハングルが嫌いなんだけど、これを思い出していや。関係ないのに。

passenger を見送った理由

でも、まだまだめんどくさい。コンパイルとか設定管理とか。

ユーザー管理周りがちょっと面倒

本家ドキュメントに以下の通り、ユーザー環境について書いてある。

8.1. User switching (security)

There is a problem that plagues most PHP web hosts, namely the fact that all PHP applications are run in the same user context as the web server. So for example, Joe’s PHP application will be able to read Jane’s PHP application’s passwords. This is obviously undesirable on many servers.

Phusion Passenger solves this problem by implementing user switching. A Rails application is started as the owner of the file config/environment.rb, and a Rack application is started as the owner of the file config.ru. So if /home/webapps/foo/config/environment.rb is owned by joe, then Phusion Passenger will launch the corresponding Rails application as joe as well.

This behavior is the default, and you don’t need to configure anything. But there are things that you should keep in mind:

The owner of environment.rb/config.ru must have read access to the application’s root directory, and read/write access to the application’s logs directory.

This feature is only available if Apache is started by root. This is the case on most Apache installations.

Under no circumstances will applications be run as root. If environment.rb/config.ru is owned as root or by an unknown user, then the Rails/Rack application will run as the user specified by PassengerDefaultUser and PassengerDefaultGroup.

User switching can be disabled with the PassengerUserSwitching option.

http://www.modrails.com/documentation/Users%20guide%20Apache.html#conflicting_apache_modules

日本語でOK

mod_phpにもプロセスはApacheがオーナーになるので、ファイルのパーミッションが甘い。Joeの740のファイルはJameのPHPから読めてしまう。apacheがプロセスだからだ

passengerはこのような問題を解決するために、PassengerDefaultUserをhttpdオプションに使います。云々

phpではこのような問題を解決するためにsuphpやらexeccgiを使うんですがね。。。実際使ってるホスティングは結構ある。


ってわけで、passengerでホスティングができるかもってタイトルは釣りっぽい、最初この人に思い切り釣られた悔しい。→ホスティングサービスでもRailsが利用できるようになるかも、な「Passenger」

passengerの動作原理

Phusion Passenger could create a new Ruby process, which will then load the Rails application along with the entire Rails framework. This process will then enter an request handling main loop.

Phusion Passenger calls fork(), but not exec().

Phusion Passenger will first create a so-called ApplicationSpawner server process. This process loads the entire Rails application along with the Rails framework, by loading environment.rb. Then, whenever Phusion Passenger needs a new worker process

http://www.modrails.com/documentation/Users%20guide%20Apache.html#spawning_methods_explained

適当にそれっぽい所を抜き出した。間違ってたらゴメン。

passengerはrailsをロードしてそれを、forkしてWokerを作る。Workerを作ってHTTPリクエストをハンドリングする。
つまり、ApacheのPre-forkっぽいことをPassenger内部でさらにやってる様子。ってことでApacheが起動したらPassengerのプロセスツリーもまとめて起動されるってことらしい。

プロセスツリーを見ればもう少しわかりやすい


passengerは確かに便利。一度インストールすると、無意識的に使える。だけど、Apacheを使ったシビアな設定には耐えられないかも・・・というちょっとした地雷予感がしたのでこの技術は枯れるまでスルーするかも

せめてAptGetで一発で入ってすぐ使えたらなぁ。。。apt-get のパッケージ動かなかったんで。。。