たごもりすメモ

コードとかその他の話とか。

mod_status互換ちっくにPassenger動作状態を見るための PassengerMonitor を作った

Passengerを使っていると端末から passenger-status と入力することで無駄に色付きの動作状態が表示されてウヒョーPassengerいたれりつくせりで便利だなー! とか思うものの30秒後にはいちいちサーバにログインしてコマンドを入力しないといけないことに我慢がならなくなってリモートからの監視機能が欲しくなり、どうせだから他のWSGI/Rack/Plackサーバはおろか当然Apache互換で監視とかしたいよねとGoogleに "Passenger mod_status" とか入力しちゃったところ、Apache で mod_status を普通に使ったときにトラブるという話しか出なくてうっきー! となってしまうアナタ向け。

passenger-status で取得できる項目のうちプロセスの動作状態だけをとりあえず出力できるようにした Rack ミドルウェア "PassengerMonitor" を作りました。

https://github.com/tagomoris/passenger-monitor

なお Passenger 3.0.0 からこのあたりの内部構造が変わっているため 2.x では動作しません。ご注意ください。

使いかた

  1. 上記リポジトリ全体を clone するか、もしくは目的のファイル単体 passenger-monitor.rb をダウンロードするかして、適当な場所に設置します
  2. config.ruに以下のように記述します
require 'passenger-monitor'   # LOAD_PATHを通しておく、もしくは require_relative で
use PassengerMonitor, :path => '/___server-status', :allow => ['10.0.0.0/8', '192.168.10.0/24']

run SomeApplication
    • path は監視用のパスを、アプリケーションの使用するパスとかぶらないように指定してください
    • allow にはアクセスを許可するネットワークのリストを、全世界から丸見えにならないように指定しましょう
  1. Passenger を動作させるユーザ設定を変更する必要があります
    • Passengerはデフォルトでは nobody ユーザで起動するようになっていますが、このユーザ権限では passenger-status にアクセスできないため、変更する必要があります
    • Apacheの設定ファイルに以下のディレクティブを追加します(ユーザ名は下記参照)
 PassengerDefaultUser root
    • なおこのユーザは以下のファイルの所有ユーザと合わせる必要があり、ほとんどの場合は root か apache や www などでしょう
 /tmp/passenger.1.0.26390/generation-0/passenger-status-password.txt
      • パスは動的生成のため数字などが毎回違います

上記のように設定した上で、許可されている場所から GET /___server-status すると以下のように出力されます。

Busy Processes (Active): 1
Idle Processes: 0
Total Processes (Count): 1
Max Processes: 6
Global Queue Size: 0

Idle Processes は passenger-status の出力にありませんが count と active の差をとって出しました。あった方が便利だったので。

今後のお話

メモリの状態とかも取れるので出すと嬉しいのかなあと思いつつ、でもメモリ使用状況なんかは普通ホスト単位で監視するよなーと思うと、あんまりやる気が湧きません。
あと監視のためにPassengerの起動ユーザをいじるのもなんか悲しいのでそのへんどうにかなると嬉しいですが、そこまで困ってるわけでもないのでパッチや英語のリクエストを書く気力も起きない……。というひどい状態です。Passengerのヘビーユーザの方々はそのへんどうなんですかね?