Supervisor とは

普通のシェルスクリプトなんかをデーモン的なプロセスとして常時起動してくれたりする便利なやつです。

Supervisor の WebInterface

/etc/supervisord.conf の中の、inet_http_server セクションのコメントアウトを外すことで、ウェブブラウザ上から管理を行うことができるようになります。

しかし、この WebInterface はルートパスでの動作しか考えられておらず、リバースプロキシを使ってサブディレクトリの中で動かそうとすると、CSSや画像、リンク周りが死にます。

数年以上 Issue が開かれていますが、ずっとオープンのままです。

そこで、リバースプロキシとして動作させている Apache 上で Body をうまく書き換えて、問題に対処しようと思います。

mod_substitute モジュール

特定のMIMEのリクエストに対して、正規表現による置換を行うことができます。

実際の conf ファイル

こんな感じの conf を書きます。

1
2
3
4
5
6
7
8
9
ProxyPass /supervisor http://localhost:9001
ProxyPassReverse /supervisor http://localhost:9001
 <Location /supervisor >
  RequestHeader unset Accept-Encoding

  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|href=\"(?!.*?http)(.*?)\"|href=\"\/supervisor\/$1\"|i"
  Substitute "s|src=\"(?!.*?http)(.*?)\"|src=\"\/supervisor\/$1\"|i"
 </Location >

RequestHeader unset Accept-Encoding しているのは、mod_substitudeによる置換が平文で行われるようにするためです。

AddOutputFilterByType で対象となるMIMEを選択し、Substitute で行う置換を記述します。

今回は、supervisorだけの必要最低限の処置として hrefsrc にサブディレクトリを付与するようにしました。(サブディレクトリは supervisor という感じに置換しているので、別ディレクトリにする場合は読み替えて下さい。)

正規表現内では、http から始まるパスを、外部ホストへのリンクと決め打ちして除くようにしているので、他のソフトに使うときも注意が必要です。