2005/09/07
Subversion-1.1.3

Subversionのインストールと設定(Apache編)

ページ内索引
Subversionのインストール
Subversionの設定
Apacheの設定
最も単純な設定
リポジトリが複数の場合
Basic認証を用いたアクセス制御
AuthzSVNAccessFileを用いたアクセス制御
ブラウザによるアクセス

SubversionはApache無しでも動作させることができますが、Apacheと連携して動作させることで、 ApacheのBasic認証やDigest認証等の認証機能、SSL等の暗号化通信等を利用することができます。
また、ブラウザから、最新のリポジトリの内容を見ることができます。
既に Apache を運用しているサーバーで Subversion を利用する場合は、Apapcheとの連携はそんなに手間では ありませんので、お勧めです。
また、Apacheが利用するポートで通信を行うため、新たにポートを空ける必要もありません。
ただし、Apacheの各種設定にはApacheの再起動を伴うケースがある事にも留意してください。


Subversionのインストール

Subversionのインストールを行います。Subversionはそれ単体でも動きます。
(本サイトでも「 Subversionのインストールと設定(svnserve編)」として紹介しています。)
このページではApacheと連携してSubversionを動作させる方法をご紹介します。

Gentoo LinuxでSubversionをインストールする際は、インストール時にUSE="apache2"を指定することで、Apache と連携して動作させることができます。
/etc/make.conf を編集するか、下記のように指定して実行してください。

# USE="apache2" emerge subversion
インストールされたSubversionのバージョンは1.1.3 でした。

Subversionの設定

Subversionがデータを管理するリポジトリと呼ばれる格納庫を作成します。
例では/var/svn/reposにリポジトリを作成しています。
# mkdir /var/svn/
# svnadmin create /var/svn/repos

Apacheがリポジトリに対して読み書きのアクセスができるように、所有権を変更します。
# chown -R apache:apache /var/svn/repos

Apacheの設定

Apacheの起動時にSubversionを有効とするように起動オプションを追加します。
追加するオプションは -D SVNです。また、-D DAV も追加して、WEBDAV機能を
有効にしてください。
/etc/conf.d/apache2を編集します。

APACHE2_OPTS="-D SVN -D DAV "

Gentoo Linuxでのmod_dav_svnの設定ファイルは、/etc/apache2/conf/modules.d/47_mod_dav_svn.conf にあります。上記で作成したリポジトリ対して設定を行います。

以下に設定に用いる主なディレクティブをまとめました。
オプション 説明
DAV svn Subversionを利用するために必ず指定しないといけません。
SVNPath リポジトリを作成したディレクトリへのパスを指定します。ApacheのDocumentRootからではなく、 システム上のパスを指定します。
SVNParentPath 主にリポジトリを複数運用する場合に用います。リポジトリの親ディレクトリを指定します。
AuthzSVNAccessFile authz_svn_module を利用するときに指定します。リポジトリへのアクセス権を指定したファイルへのパスを指定します。ApacheのDocumentRootからではなく、 システム上のパスを指定します。

最も単純な設定

認証をかけない単純な設定を以下に示します。
<IfDefine SVN>
    <IfModule !mod_dav_svn.c>
        LoadModule dav_svn_module       extramodules/mod_dav_svn.so
    </IfModule>
    <Location /svn/gside>
        DAV svn
        SVNPath /var/svn/repos
    </Location>
</IfDefine>    
SVNPathディレクティブで、リポジトリを作成したディレクトリのパスを指定します。

リポジトリが複数の場合

リポジトリを複数管理したいケースもあると思います。 SvnPathを用いた場合、リポジトリを追加するたびに設定も追加し、Apacheを再起動する必要があります。
しかし、SVNParentPathを用いれば、親となるディレクトリを指定するだけでよいため、設定が煩雑にならなくて済みます。
また、リポジトリの追加時には、Apacheを再起動する必要がありません。
リポジトリにアクセスする場合は、リポジトリ名(例ではrepos)まで指定します。
<IfDefine SVN>
    <IfModule !mod_dav_svn.c>
        LoadModule dav_svn_module       extramodules/mod_dav_svn.so
    </IfModule>
    <Location /svn/gside>
        DAV svn
        SVNParentPath /var/svn/
    </Location>
</IfDefine>    

Basic認証を用いたアクセス制御

誰でも読み書きを許す設定は、当たり前ですが好ましくありません。
以下はBasic認証を付加した設定です。これで読み取り、書き込みは認証を通過したユーザーしか 行えません。
<IfDefine SVN>
    <IfModule !mod_dav_svn.c>
        LoadModule dav_svn_module       extramodules/mod_dav_svn.so
    </IfModule>
    <Location /svn/gside>
        DAV svn
        SVNPath /var/svn/repos

        #Basic認証の設定
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /var/svn/conf/svnusers
        Require valid-user       
    </Location>
</IfDefine>

書き込みを伴うアクセスには認証をかけ、読み込みだけのアクセスは誰でも行えるように制限をかけることもできます。
この場合、<LimitExcept>ディレクティブを用いて、読み込み以外のメソッドが使用された場合は認証を必要とするよう 設定します。
<IfDefine SVN>
    <IfModule !mod_dav_svn.c>
        LoadModule dav_svn_module       extramodules/mod_dav_svn.so
    </IfModule>
    <Location /svn/gside>
        DAV svn
        SVNPath /var/svn/repos

        #Basic認証の設定
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /var/svn/conf/svnusers
        Require valid-user
            
        #リポジトリの読み込みに必要なメソッド以外は認証を必要とする
        <LimitExcept GET PROPFIND OPTIONS REPORT>
            Require valid-user
        </LimitExcept>
    </Location>
</IfDefine>
Basic詳細についてはBasic認証の設定(ファイル認証)を参照ください。

※Subversion のバージョン1.2 から「ロック機能」が導入されました。 この機能はリポジトリに認証機能が設定されていないと、動作しません。
本ページのようにBasic認証の設定を行えば、ロック機能を利用する事ができます。

AuthzSVNAccessFileを用いたアクセス制御

AuthzSVNAccessFileディレクティブを用いると、リポジトリ内のディレクトリに対して各ユーザーのアクセス権を細かく設定することが容易です。
SVNParentPathとAuthzSVNAccessFileを使用すれば、リポジトリの追加とアクセス権の設定がApacheの再起動なしに行えます。

まずは、Apache側の設定です。 Apacheの起動時にauthz_svn_module が読み込まれるように、起動オプションに-D SVN_AUTHZを追加します。
/etc/conf.d/apache2を編集します。

APACHE2_OPTS="-D SVN -D DAV -D SVN_AUTHZ"

/etc/apache2/conf/modules.d/47_mod_dav_svn.conf は以下のようになります。
<IfDefine SVN>
    <IfModule !mod_dav_svn.c>
        LoadModule dav_svn_module       extramodules/mod_dav_svn.so
    </IfModule>
    <IfDefine SVN_AUTHZ>
        <IfModule !mod_authz_svn.c>
            LoadModule authz_svn_module     extramodules/mod_authz_svn.so
        </IfModule>
    </IfDefine>    
    <Location /svn/gside>
        DAV svn
        SVNParentPath /var/svn/

        #Basic認証の設定
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /var/svn/conf/svnusers
        Require valid-user

        AuthzSVNAccessFile /var/svn/conf/svnaccess
    </Location>
 
 
</IfDefine>

AuthzSVNAccessFileで指定されたファイル(上記例では/var/svn/conf/svnaccess)にアクセス権を設定します。
書式は以下のようになります。
#リポジトリ名を指定する場合
[(リポジトリ名):(パス)]
(ユーザー名) = (アクセス権)

#パス名のみで指定する場合
[(パス)]
(ユーザー名) = (アクセス権)

以下に設定例を示します。
#リポジトリ:repos 内の/branches/doc/bug-1のアクセス権を設定します。
#hogeは読み書き、
#fugaは読み込み、
#mageはアクセス不可です。
[repos:/branches/doc/bug-1]
hoge = rw
fuga = r
mage =

#全てのユーザーは/branches/doc/に読み込みのアクセスが可能です。
[repos:/branches/doc/]
* = r

#上記でfugaは/branches/doc/bug-1に読み込みのみのアクセスしかありませんが、
#その下のact-1以下のディレクトリではこちらの設定が優先されます。
[repos:/branches/doc/bug-1/act-1]
fuga = rw

# /branchesディレクトリへのアクセスを禁止します。
[/branches]
* =

ブラウザによるアクセス

ApacheとSubversionを連携させたときのメリットとして、ブラウザから最新のリビジョンのリポジトリにアクセスできる事が あげられます。
サーバーをwww.gside.orgとした場合、他のPCのブラウザから http://www.gside.org/svn/gsideにアクセスすると、以下の画面のように なります。
Subversionにブラウザからアクセス
Index
Subversionのインストールと設定(Apache編)
Subversionのインストールと設定(svnserve編)
TortoiseSVNのインストールと設定
TortoiseSVNの使い方
Subversion Tips