複数Railsに対してリバースプロキシ&アクセス制御

やっとできた。

LighttpdMongrel(あとWebrick)しか使ってないので他のWebサーバーはよく分からないのですが、Apacheから複数Railsに対してリバースプロキシする際はMongrelが抜群に楽でした。
というのも、mongrel_railsのprefixオプションでURLのディレクトリを指定できるので。

結構よく知られた話かとはおもいますが、こんなかんじ。

mongrel_rails start -d -p 3040 -e production --prefix /redmine

こうしておくと、http://hostname:3040/redmineでアクセスするとRailsとしてはルートにアクセスしているかのように振る舞って、なおかつ、URLを生成する際、律儀にも/redmineをつけてくれるようになります。律儀だ。

どうしてこんなのが嬉しいのかというと、複数Railsにたいするリバースプロキシと相性が良いような気がするからなのです。

httpd.confをこんな感じで書くと…

<Proxy balancer://redmine_cluster>
  BalancerMember http://localhost:3040/redmine
</Proxy>
ProxyPass /redmine balancer://redmine_cluster
ProxyPassReverse /redmine balancer://redmine_cluster

http://hostname/redmine -> http://localhost(hostnameのね):3040/redmineにアクセスすることになります。

Rails側で'/redmine'ディレクトリの扱いを意識してゴリゴリやれば対応できますが、環境の都合をアプリに埋め込むのは美しくないなぁ、と。どうもLighttpdだとそうならざるを得ないようなのですが、Mongrelだと前述のとおり起動時のオプションでなんとかしてくれるので嬉しいのでした。

ちなみにRails一個だけであれば、RailsごとにURLのディレクトリを分けなくて良いので、はなっから悩む必要は無いですけども。


あと、今回少し感動したのはのなかにアクセス制御を入れられたこと。

<Proxy balancer://redmine_cluster>
  AuthType Basic
  AuthName "Hogehoge"
  AuthUserFile /hogehoge/.htpasswd
  Require valid-user
  Order deny,allow
  Deny from all
  Allow from 192.168.0.0/24
  BalancerMember http://localhost:3040/redmine
</Proxy>

Deny&Allowの動作は確認していないのだけど、Basic認証はきちんと動作していました。


稼働していたRailsRedmine+自作ので合計四つ。そろそろCeleron500では苦しいような気がしてきましたよ…