乐趣区

centos-7搭建svnapache服务器及探讨SVNParentPath和SVNPath的区别

1. 前言

今天领导让搭建一套 svn 服务器,用来存一些文档,本以为是很简单的一件事情,可是过程并没有那么顺利,主要是不理解 SVNParentPath 和 SVNPath 导致的问题,在经过查找文档和调试之后,才弄清楚他们的使用和区别,所以特此记录一下。

2.centos 7 搭建 svn+apache 服务器

1. 关闭 selinux 和防火墙

2. 安装 svn 和 apache 和 mod_dav_svn 模块


yum install httpd svn mod\_dav\_svn

3. 查看 svn 和 apache 版本,确定安装成功

[root@chenxz-test1 conf.d]# svn --version
svn, version 1.7.14 (r1542130)
   compiled Apr 11 2018, 02:40:28
Copyright (C) 2013 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/
The following repository access (RA) modules are available:
* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
  - handles 'http' scheme
  - handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
[root@chenxz-test1 conf.d]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

4. 创建仓库

# 创建仓库目录
[root@chenxz-test1 ~]# mkdir -p /home/data/svn
# 创建 svn 仓库
[root@chenxz-test1 ~]# svnadmin create /home/data/svn/test

5. 创建 svn 用户

# 创建 svn 用户及密码
[root@chenxz-test1 conf.d]# htpasswd -c /home/data/svn/passwd chenxz
New password: 
Re-type new password: 
Adding password for user chenxz

6. 用户权限管理

    svn 用户权限有 authz 文件控制,该文件由 [groups] 配置段和若干版本库路径权限段组成

    [groups]配置段格式:< 用户组 >=< 用户列表 >

    用户列表由若干个用户组或用户名构成,用户组或用户名之间用逗号 ”,” 分隔,引用用户组时要使用前缀 ”@”

    版本库路径权限段格式:

     [< 版本库名 >:< 路径 >]如版本库 abc 路径 /tmp 的版本库路径权限段的段名为 ”[abc:/tmp]”。

     可省略段名中的版本库名。若省略版本库名,则该版本库路径权限段对所有版本库中相同路径的访问控制都有效。如:[/tmp]

版本库路径权限段中配置行格式有如下三种:
       < 用户名 > = < 权限 >
       < 用户组 > = < 权限 >
        * = < 权限 >
    其中,”*” 表示任何用户;权限的取值范围为 ”、’r’ 和 ’rw’,” 表示对该版本库路径无任何权限,’r’ 表示具有只读权限,’rw’ 表示有读写权限。

注意:每行配置只能配置单个用户或用户组。

#authz 文件在每个仓库的 conf 文件夹下都有,这里是为了统一管理用户权限,所以从仓库拷贝授权文件到仓库上级目录,
cp /home/data/svn/test/conf/authz /home/data/svn/
# 在 auth 文件最后追加以下配置 
[/]
chenxz = rw

7. 修改配置文件 /etc/httpd/conf.d/subversion.conf(没有则新建), 內容为:

LoadModule dav\_svn\_module modules/mod\_dav\_svn.so  
LoadModule authz\_svn\_module modules/mod\_authz\_svn.so  
<Location /svn>  
     DAV svn  
     SVNParentPath /home/data/svn  
     AuthType Basic  
     AuthName "Authorization SVN"  
     AuthzSVNAccessFile /home/data/svn/authz  
     AuthUserFile /home/data/svn/passwd  
     Require valid-user  
</Location>  

8. 配置 apache 对 SVN 目录权限

[root@chenxz-test1 ~]# chown apache.apache /home/data/svn/ -R

9. 启动 apache

[root@chenxz-test1 conf.d]# systemctl start httpd

10. 使用 http 访问,输入用户名密码后返回版本号即搭建成功

3.SVNParentPath 和 SVNPath 的区别

百度“SVNParentPath 和 SVNPath 的区别”基本无一例外都是下面这种说法

在 svn 中文网中找到 mod_dav_mod,可以看到官网对 SVNParentPath 和 SVNPath 的说明

所以两者的区别就是,SVNParentPath 指定的是仓库的上级目录,可以管理其配置目录下面的所有仓库,这样做的好处是,只需要用一个 authz 文件管理用户,而且如果你需要一个超级管理员账户,可以登录所有 SVNParentPath 下面的仓库,这时在 authz 文件里配置 [/] 即可代表所有的仓库,而且使用 SVNParentPath 只需要在 apache 里面配置一个 location;SVNPath 指定的是一个仓库的目录,只能管理一个仓库,这样做的好处是,对权限管理更加严格,这种情况下的 authz 文件里配置的 [/] 只能代表该仓库,缺点是每增加一个仓库,就需要在 apache 里面添加一个 location。下面将给出两种配置和对应的访问方式。

1. 使用 SVNParentPath 时的 apache 配置

LoadModule dav\_svn\_module modules/mod\_dav\_svn.so  
LoadModule authz\_svn\_module modules/mod\_authz\_svn.so  
#location 这里使用仓库的上级目录  
<Location /svn>  
 DAV svn  
 #指向仓库的上级目录  
 SVNParentPath /home/data/svn  
 AuthType Basic  
 AuthName "Authorization SVN"  
 AuthzSVNAccessFile /home/data/svn/authz  
 AuthUserFile /home/data/svn/passwd  
 Require valid-user  
</Location>  

访问方式 http://ip/ 仓库的上一级 / 仓库名  如 http://192.168.202.128/svn/test

2. 使用 SVNPath 时的 apache 配置

LoadModule dav\_svn\_module modules/mod\_dav\_svn.so  
LoadModule authz\_svn\_module modules/mod\_authz\_svn.so  
#location 这里使用仓库目录  
<Location /test>  
 DAV svn  
 #指向仓库目录  
 SVNPath /home/data/svn/test  
 AuthType Basic  
 AuthName "Authorization SVN"  
 #authz 文件指向仓库下的 authz,当然指向一个统一的 authz 也不会出错,但是这么做就失去了使用 SVNPath 的意义  
 AuthzSVNAccessFile /home/data/svn/test/conf/authz  
 AuthUserFile /home/data/svn/passwd  
 Require valid-user  
</Location>  
#多个仓库需要多个 location  
<Location /mytest>  
 DAV svn  
 SVNPath /home/data/svn/mytest  
 AuthType Basic  
 AuthName "Authorization SVN"  
 AuthzSVNAccessFile /home/data/svn/mytest/conf/authz  
 AuthUserFile /home/data/svn/passwd  
 Require valid-user  
</Location>  

访问方式 http://ip/ 仓库名  如 http://192.168.202.128/test

4. 遇到的问题

出现的问题都是因为在 location、SVNPath 和 SVNParentPath 后接的目录不对导致的,比如我像下面这么配置

LoadModule dav\_svn\_module modules/mod\_dav\_svn.so  
LoadModule authz\_svn\_module modules/mod\_authz\_svn.so  
<Location /test>  
 DAV svn  
 SVNParentPath /home/data/svn/test  
 AuthType Basic  
 AuthName "Authorization SVN"  
 AuthzSVNAccessFile /home/data/svn/authz  
 AuthUserFile /home/data/svn/passwd  
 Require valid-user  
</Location>

就会出现下面的错误

再比如我像下面这样配置

LoadModule dav\_svn\_module modules/mod\_dav\_svn.so  
LoadModule authz\_svn\_module modules/mod\_authz\_svn.so  
<Location /test>  
 DAV svn  
 SVNPath /home/data/svn  
 AuthType Basic  
 AuthName "Authorization SVN"  
 AuthzSVNAccessFile /home/data/svn/authz  
 AuthUserFile /home/data/svn/passwd  
 Require valid-user  
</Location>  

就会出现下面的报错

参考:

  1. CentOS7+Apache+SVN 安装配置,并通过 HTTP 方式访问
  2. SVN+apache 中 SVNParentPath 与 SVNPath
  3. mod_dav_mod – SVN 中文网
退出移动版