svn 安装、配置及 apache 支持

本贴最后更新于 1665 天前,其中的信息可能已经物是人非

svn 作为版本管理系统,安装还是很简单的,主要的麻烦在于配置项目的访问权限,比如创建用户、为用户分组、为用户分配访问权限等。

另外 svn 可以结合 apache 实现通过 http 协议进行访问,通过 http 协议进行访问时,账号授权方式和通过 svn 直接访问有共用的地方也有不同的地方。


一、svn 安装及配置

安装 svn

这个比较简单,不同发行版通过不同包管理工具直接进行安装即可,如果发行版提供的版本不合适也可以去官网下载源码编译安装即可,我用的 freebsd,安装方式如下:

>>> sudo pkg install subversion
>>> rehash      # csh需要执行这个

创建 svn 仓库

>>> mkdir /home/svn                             # 创建svn基础目录
>>> svnadmin create /home/svn/project           # 在基础目录下创建仓库

上面命令会创建一个 svn 仓库,名字是 project,里面的目录结构如下:

>>> tree -L 1 /home/svn/project/
/home/svn/project/
|-- README.txt
|-- conf
|-- db
|-- format
|-- hooks
`-- locks

其中重点是 conf 目录,里面包含了 project 这个项目的用户账号、密码、访问权限及其他基础配置,用户添加和权限控制就在这里修改了。

启动服务

>>> svnserve -d -r /home/svn

上面的命令会以当前用户运行服务,这就要求当前用户对 /home/svn 目录有相应的读写权限。
这样就启动了 svn 服务

配置 svn 仓库

首先看一下仓库配置文件目录结构

>>> tree /home/svn/project/conf/
/home/svn/project/conf/
|-- authz                                    # 授权配置文件
|-- hooks-env.tmpl
|-- passwd                                   # 账号、密码配置文件
`-- svnserve.conf                            # 基础配置文件

1、基础配置

配置文件 svnserve.conf

[general]
anon-access = none	    	             # 禁止匿名用户访问
auth-access = write                          # 已授权用户可读写
password-db = passwd                         # 指定账号密码配置文件位置
authz-db = authz                             # 指定授权配置文件位置
realm = My First Repository                  # 认证时的提示

2、创建用户

配置文件 passwd

[users]
user1 = 123456
user2 = 123456
user3 = 123456

上面就是增加三个用户 user1user2user3 用户,密码是明文:123456

3、用户授权

配置文件 authz

[groups]                  		     # 分组配置
g_admin = user1,user2		             # 建立一个分组 g_admin,成员:user1,user2

[/]     			   	     # 通用(所有项目)的根目录的授权配置
@g_admin = rw                  		     # g_admin 分组的所有成员有读写权限
user3 = rw                         	     # user3 有读权限

[/code/java]       			     # 通用(所有项目)的 /code/java 授权配置
user3 = r          		             # user3 有读写权限

[project:/code/java]			     # project 项目的根目录的授权配置
@g_admin = rw         			     # g_admin 分组的所有成员有读写权限
user3 = rw              		     # user3 有读写权限

svn 的项目路径是:

svn://[host]/[project]

比如 project 项目的根路径:

svn://127.0.0.1/project

对于授权配置需要注意一下几点:

  • 授权配置 authz 文件中的路径都是基于项目的根路径的
  • 指明了项目名称的授权路径,其权限的优先级要高于通用的授权路径的配置

二、svn 增加 apache 支持

svn 增加 apache 支持后,便可以通过 http 协议的方式访问,可以直接在浏览器中浏览项目

安装 apache

如已经安装 apache 可跳过,可以使用包管理器进行安装,我使用的 freebsd,安装方式如下

>>> sudo pkg install apache24

安装后可以在 /etc/rc.conf 中配置开启启动 apache 服务

>>> cat /etc/rc.conf
apache24_enable="YES"

安装 mod_dav_svn

该模块用于在 apache 中支持访问 svn

>>> sduo pkg install mod_dav_svn

配置 svn 支持

首先需要打开 dav_module 模块,如下

>>> cat /usr/local/etc/apache24/httpd.conf | grep dav
LoadModule dav_module libexec/apache24/mod_dav.so

然后配置 svn 的路径,如下

>>> cat /usr/local/etc/apache24/modules.d/220_subversion.conf | grep -v #  | grep -v ^$
LoadModule dav_svn_module     libexec/apache24/mod_dav_svn.so
LoadModule authz_svn_module   libexec/apache24/mod_authz_svn.so
<IfModule dav_svn_module>
<Location /svn/>
	<ifModule mime_module>
		RemoveEncoding  .gz .tgz .Z
		RemoveType      .gz .tgz .Z
	</ifModule>
	DAV svn
	SVNParentPath /home/svn/              			# 设置 svn 基础目录
	SVNListParentPath on					# 可以看到项目列表
	SVNAutoversioning off
	SVNReposName "Project XYZ repo"
	AuthzSVNAnonymous off					# 禁止匿名访问
	SVNIndexXSLT "/style/svnindex.xsl"
	AuthType Basic						# 基础认证类型
	AuthName "Authorization Realm"
	AuthUserFile /home/svn/project/conf/htpasswd		# 指定账号配置文件的位置
	AuthzSVNAccessFile /home/svn/project/conf/authz		# 指定授权文件位置
	Require valid-user					# 只允许授权的用户访问
	LimitXMLRequestBody 0
</Location>
</IfModule>

上面配置中,重点关注 AuthUserFile,这里存放用户账号信息,注意这个账号信息和上面说的 svn 账号配置不一致,svn 原生配置中使用的密码是明文,这里的账号密码使用的是密文,而生成密文需要借助 htpasswd 工具,这个是 apache 自带的,使用方式如下:

>>> htpasswd -nb user1 123456
user1:$apr1$heAgGt3/$V28L3wRUGLXGJGecUdYzr/

上面生成的是用户名为 user1,密码为 123456 的账号,将生成的账号密码信息放入 /home/svn/project/conf/htpasswd 文件,注意还需要在 /home/svn/project/conf/authz 中配置账号 user1 的授权信息,然后重启 apache 服务重启即可在浏览器中正常访问了,访问路径如下:

http://[host]/svn/[project]

如:

http://127.0.0.1/svn/project

然后输入账号和密码即可。


三、使用 svn 子域名

可以借助 nginx 的反向代理功能将访问域名改成 svn 子域名,去掉路径中的 svn,比如

http://www.example.com/svn/project
替换成如下:
http://svn.example.com/project

这样需要 apache 让出 80 端口,改用其他端口,由 ngnix 监听 80 端口,配置如下:

apache 配置

Listen 82

nginx 配置

>>> cat /usr/local/etc/nginx/sites/svn.conf
upstream svn_backend {
	server localhost:82 max_fails=2 fail_timeout=30s;
}

server {
	listen 80;
	server_name svn.example.com;

	charset utf-8;
	access_log /var/log/nginx/access.log main;

	location / {
		proxy_set_header  Host $host:$server_port;
		proxy_set_header  X-Real-IP  $remote_addr;
		client_max_body_size  10m;
		proxy_pass http://svn_backend/svn/;
	}
}

重启 apachenginx 后就可以使用 svn.example.com 访问了。

注意:如果修改后没有变化,可能是浏览器缓存导致的,所以要禁用缓存,否则就要查看 apachenginx 的日志查看具体原因了

  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 687 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...