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>
就会出现下面的报错
参考:
- CentOS7+Apache+SVN 安装配置,并通过 HTTP 方式访问
- SVN+apache 中 SVNParentPath 与 SVNPath
- mod_dav_mod – SVN 中文网