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
DAV svn
SVNParentPath /home/data/svn
AuthType Basic
AuthName "Authorization SVN"
AuthzSVNAccessFile /home/data/svn/authz
AuthUserFile /home/data/svn/passwd
Require valid-user
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的区别”基本无一例外都是下面这种说法
所以两者的区别就是,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这里使用仓库的上级目录
DAV svn
#指向仓库的上级目录
SVNParentPath /home/data/svn
AuthType Basic
AuthName "Authorization SVN"
AuthzSVNAccessFile /home/data/svn/authz
AuthUserFile /home/data/svn/passwd
Require valid-user
访问方式 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这里使用仓库目录
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
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
访问方式 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
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
就会出现下面的错误
再比如我像下面这样配置
LoadModule dav\_svn\_module modules/mod\_dav\_svn.so
LoadModule authz\_svn\_module modules/mod\_authz\_svn.so
DAV svn
SVNPath /home/data/svn
AuthType Basic
AuthName "Authorization SVN"
AuthzSVNAccessFile /home/data/svn/authz
AuthUserFile /home/data/svn/passwd
Require valid-user
就会出现下面的报错
参考: