SubversionとApacheの連携の設定(Windows編)

前回の記事(Subversionサーバーをインストール(Windows編))では、svnserveを利用して、主にLAN内のネットワークでのリポジトリ管理を実現しました。

今回は、もうひとつのリポジトリ共有方法である、Apacheサーバを使用してみましょう。これにより、インターネット経由や、もう少し規模の大きいプロジェクトでのリポジトリ共有が実現できます。

Apacheのインストール

最初に、Windows版のApacheをインストールします。これはそれほど手間のかかる作業ではありません。

このページからApache2.2をダウンロードします。今回は、「httpd-2.2.22-win32-x86-no_ssl.msi」としました。

ダブルクリックして、インストールしましょうね。

リポジトリをWebDAV経由で公開する設定

Apacheのインストールが終了したら、subversionのリポジトリ配下のディレクトリをApache経由で公開してみましょう。公開には、WebDAVという仕組みを利用します。

WebDAVとは、HTTPを拡張し、Webブラウザなどのクライアントから、Webサーバ経由でファイルやフォルダを管理できるようにした仕様です。

「mod_dav.so」と「mod_dav_fs.so」が、Apacheをインストールしたディレクトリの「modules」フォルダの下にあるはずです。このモジュールを有効にすることで、WebDAVの利用が可能になります。

Apacheの設定ファイルである、「{ApacheインストールDir}confhttpd.conf」の初期設定では、このモジュールを読み込まないようになっていますので、httpd.confの以下の行のコメントを外しましょう。(先頭の「#」を取ります)

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

次に、「mod_dav_svn.so 」と「mod_authz_svn.so 」をApacheで利用できるようにします。これらのファイルは「{ApacheインストールDir}modules」には無く、「{subversionインストールDir}bin」にあります。ここからこの2つのファイルを「{ApacheインストールDir}modules」にコピーしましょう。

そのうえで、httpd.confに、以下の2行を追加します。

LoadModule dav_svn_module modules/mod_dav_svn.so 
LoadModule authz_svn_module modules/mod_authz_svn.so

ここで、一回、Apacheを再起動してみましょう。ここで起動が失敗したら、もう一度モジュールの置き場所や名称、設定ファイルの記述を見直します。

それではApachwe経由でSubversionが見れるように設定します。ユーザ認証は後から入れるとして、まずは以下の記述をhttpd.confの最後に追加しましょう。(#の行はコメントアウトされていますので、指定は無効です。)

<Location /svn/>
    DAV svn
    SVNParentPath "C:/repo/"
    SVNListParentPath on
    #AuthzSVNAccessFile bin/apachesvnauth
    #AuthType Basic
    #AuthName "Subversion repository"
    #AuthUserFile bin/apachesvnpasswd
    #Require valid-user
</Location>

各設定の意味は以下の通りです。

  • <Location /svn/>・・・subversionのRootディレクトリ以下をどのようなURLで表示させるかを指定します。左記の設定なら、「http://localhost/svn/」となります。
  • SVNParentPath C:/repo/・・・リポジトリのルートフォルダを指定します。前回の記事中のrootスイッチで指定したディレクトリになります。
  • SVNListParentPath on・・・「http://localhost/svn/」というURLでアクセスされたときに、リポジトリ配下のディレクトリをリスト表示させるかどうかを指定します。

それでは、ブラウザで「http://localhost/svn/」にアクセスしてみましょう。

のように。リポジトリroot配下がリスト表示されましたか?されない場合は今までの設定を見直してみてください。

セキュリティ(ユーザ、パスワード)の設定

さて、このままでは、URLを知っている人全員がsubvesionディレクトリを見れてしまいます。そこで、アクセスできるユーザを制限できるように設定しましょう。

BASIC認証の追加

まずは、このディレクトリへのアクセス権限を、BASIC認証で制限しましょう。そのためには、以下の手順でBASIC認証用のユーザを作成し、パスワードを設定します。

> cd {Apacheインストールフォルダ}/bin
> htpasswd -c "{ApacheインストールDir}/bin/apachesvnpasswd" {UserName}
New password: ********
Re-type new password: ********
Adding password for user {UserName}

今回は、{UserName}として、「apachesvn」というユーザを作成してみました。では、httpd.confでBASIC認証に関係する部分のコメントアウトを外して、Apacheを再起動しましょう。設定は以下のようになります。

<Location /svn/>
    DAV svn
    SVNParentPath "C:/repo/"
    SVNListParentPath on
    #AuthzSVNAccessFile bin/apachesvnauth
    AuthType Basic
    AuthName "Subversion repository"
    AuthUserFile bin/apachesvnpasswd
    Require valid-user
</Location>

再度「http://localhost/svn」にアクセスすると、下記のようなBASIC認証のダイアログが開きましたでしょうか。

ユーザ認証をより細かく制御する

上記のBASIC認証だけだと、BASIC認証をクリアしたユーザは認証ディレクトリ(http://localhost/svn)配下のファイルを自由に書き込んだりすることができます。

あるユーザにはreadはさせるが、ファイルのコミット等の変更は行わせたくないと言った制御を行いたい場合は、

#AuthzSVNAccessFile bin/apachesvnauth

のコメントアウトを外して、設定を有効にしましょう。TortoiseSVN等のクライアントソフトから、Http経由でバージョン管理を行う場合には、必須の設定と言えます。

リポジトリの配下に自動で生成されたフォルダ「conf」があり、その中に、「authz」というファイルがあったかと思います。これが、ひな型になりますので、これを「{ApacheインストールDir}bin」配下に「apachesvnauth」という名前でコピーし、中身を以下のように変更します。

[groups]
dev_team = sasuke,sam
 
[/]
@dev_team = r
apachesvn = r
* = r
 
[/repo_sample/]
@dev_team = rw
apachesvn = rw

上記のように、チームごとにアクセス制限を行ったりできます。(「@dev_team = rw」のところですね)今回BASIC認証に追加したユーザは「apachesvn」でしたから、このユーザに対して「repo_sample」リポジトリの書き込み権限を許可するという設定になります。

もし、BASIC認証のユーザが登録されていたとしても、このように設定しておけば、他の人は読み取りはできるものの、コミット等はできません。