概述
我们将使用以下软件组合:

- Apache: 作为 Web 服务器,提供 HTTP/S 访问和用户认证。
- SVN (Subversion): 版本控制系统的核心服务器软件。
- SVN-Mod (mod_dav_svn): Apache 的一个模块,使 Apache 能够理解并处理 SVN 协议。
- HTTPS: 通过配置 SSL/TLS 来加密数据传输,保证安全性。
第一步:准备工作
-
系统要求:
- 一台干净的 Linux 服务器(推荐 CentOS 7/8 或 Ubuntu 20.04/22.04)。
- 拥有
root或sudo权限的用户。 - 服务器有固定的公网 IP 地址。
- 已关闭防火墙或 SELinux(如果不确定如何配置,可以先临时关闭,配置完成后再按需开启)。
-
关闭防火墙和 SELinux(临时,可选)
- 关闭防火墙:
# 对于 CentOS 7/8 sudo systemctl stop firewalld sudo systemctl disable firewalld
- 关闭 SELinux:
sudo setenforce 0 # 编辑 /etc/selinux/config 文件,将 SELINUX=disabled 永久关闭
- 关闭防火墙:
第二步:安装 Apache 和 SVN
使用包管理器(yum 或 apt)安装所需的软件。
对于 CentOS / RHEL / Rocky Linux:

# 更新软件包列表 sudo yum update -y # 安装 Apache、SVN 服务器和 Apache 的 SVN 模块 sudo yum install -y httpd subversion mod_dav_svn
对于 Ubuntu / Debian:
# 更新软件包列表 sudo apt update # 安装 Apache、SVN 服务器和 Apache 的 SVN 模块 sudo apt install -y apache2 subversion libapache2-mod-svn
安装完成后,启动并设置 Apache 开机自启:
# 启动 Apache 服务 sudo systemctl start httpd # 设置 Apache 开机自启 sudo systemctl enable httpd
检查 Apache 服务状态:
sudo systemctl status httpd
你应该看到 active (running) 的状态。

第三步:创建 SVN 仓库
我们需要一个专门存放 SVN 仓库的目录。
-
创建仓库根目录
sudo mkdir -p /var/svn/repos
-
创建一个新的 SVN 仓库 我们创建一个名为
myproject的项目仓库。sudo svnadmin create /var/svn/repos/myproject
-
设置仓库目录的所有权 为了让 Apache 进程能够读写仓库,需要将仓库的所有权分配给 Apache 运行时的用户,在 CentOS 上,这个用户是
apache;在 Ubuntu 上是www-data。# CentOS sudo chown -R apache:apache /var/svn/repos # Ubuntu # sudo chown -R www-data:www-data /var/svn/repos
第四步:配置 Apache 访问 SVN
这是最关键的一步,我们将配置 Apache 来托管 SVN 仓库,并启用用户认证。
-
创建 SVN 配置文件 在 Apache 的
conf.d目录下创建一个配置文件。sudo vim /etc/httpd/conf.d/svn.conf
粘贴到文件中,请根据你的实际情况修改
SVNParentPath和SVNListParentPath的路径。# 启用 SVN 和 DAV 模块 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so # --- 全局 SVN 配置 --- # 设置 SVN 仓库的父目录 SVNParentPath /var/svn/repos # 允许列出父目录下的所有仓库名称(方便发现仓库) SVNListParentPath on # --- 针对 myproject 仓库的特定配置 --- <Location /svn/myproject> # 指定具体的仓库路径 DAV svn SVNPath /var/svn/repos/myproject # 认证类型:基本认证(用户名/密码) AuthType Basic # 认证领域,会在浏览器弹窗中显示 AuthName "SVN Repository for MyProject" # 使用哪个文件来存储用户名和密码 AuthUserFile /etc/svn-auth-users # 只有认证通过的用户才能访问 Require valid-user # 权限控制,使用哪个文件来定义用户/组的访问权限 AuthzSVNAccessFile /etc/svn-authz </Location> # --- 可选:列出所有父目录下的仓库 --- # 如果你启用了 SVNListParentPath,可以添加如下配置 # <Location /svn> # DAV svn # SVNParentPath /var/svn/repos # AuthType Basic # AuthName "SVN Repositories" # AuthUserFile /etc/svn-auth-users # Require valid-user # AuthzSVNAccessFile /etc/svn-authz # </Location> -
创建密码文件 我们使用
htpasswd命令来创建和管理用户,这个命令通常随 Apache 安装。-c参数表示创建新文件(仅在第一次创建时使用)。-m参数表示使用 MD5 加密密码(推荐)。
# 创建第一个用户 user1 sudo htpasswd -cm /etc/svn-auth-users user1 # 系统会提示你输入并确认密码 # 创建第二个用户 user2 sudo htpasswd -m /etc/svn-auth-users user2 # 注意:这里不再使用 -c,否则会覆盖之前的文件
现在你有了一个包含用户名和加密密码的文件
/etc/svn-auth-users。 -
创建权限控制文件 这个文件用于精细控制不同用户对不同仓库或目录的读写权限。
sudo vim /etc/svn-authz
粘贴到文件中:
# 全局设置 [groups] # 定义一个名为 'developers' 的用户组,包含 user1 和 user2 developers = user1, user2 # 针对 myproject 仓库的权限设置 [/] # 'developers' 组的成员对根目录有读写权限 @developers = rw # 针对 myproject/branches 目录的权限设置 [/myproject/branches] # user1 对 branches 目录有读写权限 user1 = rw # user2 对 branches 目录只有读权限 user2 = r # 针对 myproject/tags 目录的权限设置 [/myproject/tags] # 'developers' 组的成员对 tags 目录只有读权限 @developers = r # 针对 myproject/trunk 目录的权限设置 [/myproject/trunk] # 'developers' 组的成员对 trunk 目录有读写权限 @developers = rw
-
设置配置文件的所有权 Apache 进程需要能够读取这两个配置文件。
# CentOS sudo chown apache:apache /etc/svn-auth-users /etc/svn-authz # Ubuntu # sudo chown www-data:www-data /etc/svn-auth-users /etc/svn-authz
-
重启 Apache 服务使配置生效
sudo systemctl restart httpd
第五步:测试 SVN 服务器
你可以通过命令行或图形客户端来测试你的 SVN 服务器了。
使用命令行客户端 (svn)
假设你的服务器 IP 是 168.1.100。
-
列出仓库
svn list svn://192.168.1.100/svn/myproject
浏览器会弹出用户名/密码输入框,输入你之前创建的用户(如
user1)和密码,如果认证成功,应该能看到仓库中的内容(如trunk,branches,tags)。 -
检出仓库
# 创建一个本地目录用于检出 mkdir -p ~/svn_test cd ~/svn_test # 检出仓库到本地 svn checkout svn://192.168.1.100/svn/myproject .
同样需要输入用户名和密码,完成后,你的
