- 通过 Web 浏览器访问:用户可以直接在浏览器中查看仓库内容。
- 成熟的权限控制:可以利用 Apache 的
.htaccess文件和用户认证,实现精细化的访问控制。 - SSL/TLS 支持:可以轻松配置 HTTPS,确保数据传输安全。
- 集成性好:可以与现有的 Web 服务和认证系统(如 LDAP)集成。
整体流程概览
- 安装必要软件:安装 SVN、Apache 和 SVN 的 Apache 模块。
- 创建 SVN 仓库:在服务器上创建一个或多个 SVN 版本控制仓库。
- 配置 Apache:编辑 Apache 的配置文件,让它知道如何处理 SVN 请求。
- 配置 SVN 认证:创建用于访问 SVN 仓库的用户和密码。
- 启动并测试服务:启动 Apache 服务,并从客户端进行连接测试。
详细步骤
我们以一个常见的 Linux 发行版(如 CentOS/RHEL 或 Ubuntu/Debian)为例进行说明。

第 1 步:安装必要的软件包
对于 CentOS / RHEL / Rocky Linux / AlmaLinux:
# 更新软件包列表 sudo yum update # 安装 subversion, httpd (Apache), 和 mod_dav_svn 模块 sudo yum install -y subversion httpd mod_dav_svn
对于 Ubuntu / Debian:
# 更新软件包列表 sudo apt update # 安装 subversion, apache2, 和 libapache2-svn 模块 sudo apt install -y subversion apache2 libapache2-svn
安装完成后,mod_dav_svn 模块会自动在 Apache 中启用。
第 2 步:创建 SVN 仓库
我们约定将 SVN 仓库存放在 /var/svn 目录下。

# 创建仓库根目录 sudo mkdir -p /var/svn # 创建一个新的 SVN 仓库,例如名为 'myproject' # 使用 --fs-type fsfs 表示使用文件系统存储,这是推荐的方式 sudo svnadmin create /var/svn/myproject # 设置仓库目录的所有权,让 Apache 用户可以读写 # Apache 的默认运行用户在 CentOS 上是 'apache',在 Ubuntu 上是 'www-data' # 你可以使用 `ps aux | grep httpd` 或 `ps aux | grep apache2` 来确认 sudo chown -R apache:apache /var/svn/myproject # CentOS/RHEL # sudo chown -R www-data:www-data /var/svn/myproject # Ubuntu/Debian # 设置适当的权限 sudo chmod -R 770 /var/svn/myproject
第 3 步:配置 Apache
这是最关键的一步,我们将创建一个专门的 Apache 配置文件来管理 SVN 访问。
创建 Apache 配置文件
# 使用你喜欢的文本编辑器,如 vim 或 nano sudo vim /etc/httpd/conf.d/svn.conf # CentOS/RHEL # sudo vim /etc/apache2/sites-available/svn.conf # Ubuntu/Debian
在配置文件中添加以下内容
这是一个基本配置,允许所有用户读写访问,我们稍后会修改它以增加认证。

# 在 CentOS/RHEL 上,配置文件通常在 /etc/httpd/conf.d/
# 在 Ubuntu/Debian 上,配置文件通常在 /etc/apache2/sites-available/
# 需要使用 `a2ensite svn.conf` 启用,并创建符号链接到 sites-enabled/
<Location /svn>
# 设置 SVN 仓库的根目录
DAV svn
SVNParentPath /var/svn
# 认证类型(Basic, Digest 等)
AuthType Basic
# 认证领域,会在浏览器弹窗中显示
AuthName "SVN Repository for MyProject"
# 指定用户密码文件的位置
# 注意:这个文件我们稍后会创建
AuthUserFile /etc/svn-auth-users
# 只有认证成功的用户才能访问
Require valid-user
# (可选)控制访问权限
# 这行表示允许所有认证用户都有读写权限
# SVNPathAuthz on
# <LimitExcept GET PROPFIND OPTIONS REPORT>
# Require valid-user
# </LimitExcept>
</Location>
配置文件解释:
<Location /svn>:定义一个 URL 路径/svn作为 SVN 服务的入口,用户将通过http://your_server_ip/svn/myproject来访问仓库。DAV svn:告诉 Apache 这个位置使用 DAV 协议,并且是 SVN。SVNParentPath /var/svn:指定包含所有 SVN 仓库的父目录,这样你就可以通过/svn/myproject,/svn/anotherproject等路径访问多个仓库。AuthType Basic:使用基础的 HTTP 认证。AuthName "...":认证提示信息。AuthUserFile /etc/svn-auth-users:存储用户名和密码的文件路径。Require valid-user:强制要求只有AuthUserFile中存在的用户才能访问。
检查并保存配置
确保你的配置没有语法错误。
对于 CentOS/RHEL:
sudo apachectl configtest # 如果输出 Syntax OK,则表示配置正确
对于 Ubuntu/Debian:
# 如果是首次创建配置文件,需要启用它 sudo a2ensite svn.conf # 检查语法 sudo apache2ctl configtest
第 4 步:创建 SVN 认证用户
现在我们来创建可以访问 SVN 仓库的用户。
# 使用 htpasswd 命令创建第一个用户 'user1' # -c 选项表示创建新文件,如果文件已存在则不用 -c sudo htpasswd -c /etc/svn-auth-users user1 # 系统会提示你输入并确认密码 # New password: # Re-type new password: # 添加更多用户(注意:添加第二个及以后的用户时,不要使用 -c 选项) sudo htpasswd /etc/svn-auth-users user2 sudo htpasswd /etc/svn-auth-users user3
你可以使用 cat /etc/svn-auth-users 查看文件内容,它会是一行一行的加密密码。
第 5 步:启动并启用服务
启动并设置开机自启
对于 CentOS/RHEL:
sudo systemctl start httpd sudo systemctl enable httpd
对于 Ubuntu/Debian:
sudo systemctl start apache2 sudo systemctl enable apache2
检查服务状态
sudo systemctl status httpd # CentOS/RHEL # sudo systemctl status apache2 # Ubuntu/Debian
确保服务状态为 active (running)。
第 6 步:防火墙设置
如果服务器开启了防火墙,需要开放 HTTP (80) 和 HTTPS (443) 端口。
对于 CentOS/RHEL / Rocky Linux / AlmaLinux (使用 firewalld):
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
对于 Ubuntu / Debian (使用 ufw):
sudo ufw allow 'Apache Full' sudo ufw reload
第 7 步:测试连接
你可以从任何一台电脑上进行测试了。
使用浏览器访问
打开浏览器,输入 http://<你的服务器IP地址>/svn/myproject。
你应该会弹出一个认证窗口,输入你之前创建的用户名(如 user1)和密码,认证成功后,你将看到仓库的目录结构。
使用 SVN 客户端访问
如果你安装了 SVN 客户端(如 TortoiseSVN 或 svn 命令行工具),可以检出仓库。
# svn checkout http://<你的服务器IP地址>/svn/myproject [本地目录] svn checkout http://192.168.1.100/svn/myproject ~/myproject_local
它会提示你输入用户名和密码,成功后,你就在本地得到了一个工作副本。
进阶配置:基于路径的访问控制 (Path-based Authorization)
你不仅可以控制谁能访问,还可以控制谁能访问哪个仓库的哪个目录。
启用 SVNPathAuthz
编辑之前的 Apache 配置文件 /etc/httpd/conf.d/svn.conf,取消注释或添加 SVNPathAuthz on。
<Location /svn>
DAV svn
SVNParentPath /var/svn
AuthType Basic
AuthName "SVN Repository"
AuthUserFile /etc/svn-auth-users
SVNPathAuthz on # <--- 启用基于路径的授权
Require valid-user
</Location>
创建 authz 文件
这个文件定义了用户和用户组对不同路径的读写权限。
创建一个全局的 authz 文件:
sudo vim /etc/svn-authz
/etc/svn-authz 文件示例:
# [groups] 定义用户组 [groups] # 定义一个名为 'developers' 的组,包含 user1 和 user2 developers = user1, user2 # 定义一个名为 'admins' 的组,包含 user3 admins = user3 # [/] 表示所有仓库的根目录 # @developers 组的成员对所有仓库有读写权限 [/] @developers = rw # [myproject:/] 特指 'myproject' 仓库的根目录 # user3 用户对 'myproject' 仓库有读写权限 [myproject:/] user3 = rw # [myproject:/private] 特指 'myproject' 仓库下的 'private' 目录 # 这个目录只有 'admins' 组的成员可以读写 [myproject:/private] @admins = rw * = # 其他用户无任何权限
让 Apache 读取 authz 文件
编辑 Apache 配置文件,在 SVNParentPath 后面添加 AuthzSVNAccessFile 指令。
<Location /svn>
DAV svn
SVNParentPath /var/svn
AuthzSVNAccessFile /etc/svn-authz # <--- 指向 authz 文件
AuthType Basic
AuthName "SVN Repository"
AuthUserFile /etc/svn-auth-users
SVNPathAuthz on
Require valid-user
</Location>
重启 Apache 服务
sudo systemctl restart httpd # CentOS/RHEL # sudo systemctl restart apache2 # Ubuntu/Debian
你的 SVN 服务器就配置完成了,并且具有精细的访问控制能力。
