複数Railsに対してリバースプロキシ&アクセス制御
やっとできた。
LighttpdとMongrel(あと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認証はきちんと動作していました。
稼働していたRailsはRedmine+自作ので合計四つ。そろそろCeleron500では苦しいような気がしてきましたよ…