centos 7搭建svn+apache服务器及探讨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访问,输入用户名密码后返回版本号即搭建成功

image.png

3.SVNParentPath和SVNPath的区别

百度“SVNParentPath和SVNPath的区别”基本无一例外都是下面这种说法
image.png
在svn中文网中找到mod_dav_mod,可以看到官网对SVNParentPath和SVNPath的说明
image.png
所以两者的区别就是,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>

就会出现下面的错误
1.jpg
再比如我像下面这样配置

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>  

就会出现下面的报错
2.jpg

参考:

  1. CentOS7+Apache+SVN安装配置,并通过HTTP方式访问
  2. SVN+apache中SVNParentPath与SVNPath
  3. mod_dav_mod - SVN中文网
阅读 188

推荐阅读