ReverseProxy経由でSubversionを使う時の問題

ReverseProxyにはApache2.2を使って、別サーバのSubversionを使う場合の話。
Subversionに限った話じゃないけど、ReverseProxyの利点は

  • SSL暗号化の負担をReverseProxyに任せられる。
  • 各WebコンテンツやWebアプリを複数サーバに分散化できる。
  • Wikipediaが使っているように)HTTPアクセレーターとして使える。
  • サーバがReverseProxy経由でアクセスされるので、危険性が下がる。

それで、Apacheのmod_proxyを使えばSubversionをReverseProxyを経由させることができる。
だけど、ちょっと問題がある。
それはReverseProxyにはhttps(443)で受けて、Subversionへhttp(80)で送る場合に、copyとmoveが失敗する。
これはリクエストのDestinationヘッダーの値のプロトコルと実際のプロトコルが違うことで、502エラーになる*1
http://nikki.hio.jp/?date=20070331
http://d.hatena.ne.jp/moriyoshi/searchdiary?word=*%5Bmod_proxy%5D
http://subversion.tigris.org/servlets/ReadMsg?listName=dev&msgNo=96866
ここいらに書かれていることを参考にした。
で、要はこのDestinationヘッダーを書き換えてやれば、問題が解決できる。
上記リンクのひおにっき(mod_rewriteモジュールを使った)の場合を試してみたんだが、なぜだか上手くいかない。
誰か教えて欲しい。
で、手っ取り早い方法がないかと探していたら、ひおにっきのリンクをたどった先に
http://silmor.de/49
があった。
ここでmod_headersモジュールだけで可能なんだけど、Apache2.2.4以上じゃないといけないみたい。
CentOS5の現時点のApacheは2.2.3で、この設定ファイルの書き方では動作しないことを確認済み。
なので、無理やりmod_headersだけをバージョンアップさせることに成功した。
やり方はSubversionを使うApache側(ReverseProxy側ではない)で、以下の作業を行う。

  • yum -y install httpd-develを実行して、apxsをインストールする。
  • 念のために/etc/httpd/modules/mod_headers.soのバックアップを取っておく。
  • Apache2.2.4のソースコードをダウンロードして解凍する。
  • 解凍したフォルダ内のmodles/metadataに移動して、mod_headers.cがあることを確認する。
  • apxs -c -i -a mod_headers.cでコンパイルができ、/etc/httpd/modles/にmod_headers.soができていはず。ちなみに/usr/sbin/にはパスが通っているはずなので、apxsだけでいい。

これでmod_headers.soが置き換わっているので、次にApacheの設定を。
Apacheの設定ファイル内で、Subvresionの書かれたところ、ロケーションタグ内に

RequestHeader edit Destination ^https http

を追加で書く*2
Apacheを再起動し、ReverseProxy経由でアクセスしてみて、move、copyができればOK。
ちなみに、ReverseProxyのほうはSSL関連のところに普通にセッティングすればよく、例を以下に。

・・・

・・・
ProxyRequests Off

Order deny,allow
Allow from all

ProxyPass /svn/ http://svn-host/svn/
ProxyReverse /svn/ http://svn-host/svn/
・・・

・・

svn-hostSubversionがインストールされているホスト名、svnSubversionリポジトリパス。
これでhttps→httpに結構楽にできる。
ただ、:8080のような既定のポート以外の場合はどのように書けばいいか、試していないのでわからない。


補足:Linuxとタグをつけてるが、Windowsでも可能だと思う。

*1:WireSharkで検証済み

*2:Apache2.2.4以上を使っている場合は、ここの設定だけでいい