リバースプロキシ設定

私の環境では外部向けに公開している Apache の入っているホストとは別のホスト上に、SVNリポジトリを作成しました。
このままでは外部から SVN リポジトリにアクセスできないため、リバースプロキシを設定して https://svn.〜/ のときに SVN リポジトリの入っているホストにリクエストを転送するようにしました。

SVN リポジトリの入っているホストでは、WebDAV プロトコルを使用した SVN との連携を設定済みです。

snares:/etc/httpd/conf.d/vhosts/vhosts.conf

<Location />
  DAV svn
  SVNPath /mnt/repositories@chinstrap/svn

  #<LimitExcept GET PROPFIND OPTIONS REPORT>
    SSLRequireSSL
    AuthType Basic
    AuthName "Authorization Realm"
    AuthUserFile /mnt/repositories@chinstrap/svn/conf/htpasswd
    Require valid-user
  #</LimitExcept>
</Location>

Basic 認証をつかっているため、SSL 以外ではコミットなどの作業をできないように設定しています。
このため、リバースプロキシの設定もアクセスされたのが http の場合は http に、https の場合は https に転送するようにしています。

http://d.hatena.ne.jp/NetPenguin/20081127#p1 にあるように、ファイルを分割して仮想ホスト+SSLの設定をしていますのでリライトの設定についても SSL の有無に関係なく一か所で済むようにします。編集対象としているファイルの詳細については、http://d.hatena.ne.jp/NetPenguin/20081127#p1 のエントリを参照してください。

rockhopper:/etc/httpd/conf.d/vhosts/vhosts.conf
外部からの SVN リポジトリへのアクセスを受け付ける仮想ホストを用意します。

<VirtualHost *:80>
  Include conf.d/vhosts/svn.netpenguin.org.part

  ErrorLog logs/svn.netpenguin.org.error_log
  CustomLog logs/svn.netpenguin.org.access_log  combined
</VirtualHost>
<VirtualHost *:443>
  Include conf.d/vhosts/ssl.part
  Include conf.d/vhosts/svn.netpenguin.org.part

  ErrorLog logs/svn.netpenguin.org.error_log
  CustomLog logs/svn.netpenguin.org.access_log combined
  CustomLog logs/svn.netpenguin.org.ssl_request_log ssl_request


rockhopper:/etc/httpd/conf.d/vhosts/svn.netpenguin.org.part
外部からの SVN アクセスを、実際に SVN リポジトリを公開しているサーバに転送します。
外部向けに登録している SVN サーバのホスト名も、内部のホスト名も svn.netpenguin.org なので紛らわしいですが、RewriteRule に記述している https://svn.netpenguin.org/ は内部向けに用意している DNS によって解決され、そのアドレスはプライベート IP (SVN リポジトリを公開しているホストの IP アドレス)になります。

ServerName svn.netpenguin.org

SSLProxyEngine On
RewriteEngine On
ProxyRequests Off

RewriteCond %{HTTPS} on [NC]
RewriteRule ^/(.*) https://svn.netpenguin.org/$1 [P]

RewriteCond %{HTTPS} off [NC]
RewriteRule ^/(.*) http://svn.netpenguin.org/$1 [P]

この設定では、HTTPS によるアクセスを扱うために SSLProxyEngine On を指定し、また http でのアクセスは http のまま、https でのアクセスは https として転送するために、RewriteCond %{HTTPS} on (あるいはoff)の指定によって適用するリライトルールを分けています。
実際に外部(e-mobile経由)から試してみましたが、問題なく SVN リポジトリにアクセスできました。

ちなみに、単純にリバースプロキシを構築するだけであれば、RewriteRule ではなく ProxyPass の設定だけで十分かと思います。
あと、本来であれば ProxyPassReverse も設定した方が良いのですが、SVN リポジトリへのアクセスでリダイレクト等は発生しないだろうと思い未設定です。これを設定する場合、同じ記述での http/https 両対応が難しそうなので http アクセスの場合は https にリダイレクトさせてしまい、それから ProxyPass によって https://〜 に転送、ProxyPassReverse も https://〜 で設定という流れにするかと思います。(ためしてないけど)

一つのグローバルIP自鯖を立てている環境では、仮想ホストとリバースプロキシは必須だなぁと実感してたりします。あと、無料の DynamicDNS サービスも。