凌峰创科服务平台

CentOS SVN服务器配置步骤有哪些?

CentOS SVN 服务器配置完整指南

本教程将指导您在 CentOS 7 或 CentOS 8 系统上,使用 Apache 和 mod_dav_svn 模块来搭建一个功能完善的 SVN 服务器,这种方式的优势在于可以利用 Apache 的强大功能,如 HTTPS 加密、基本认证、LDAP 集成等。

CentOS SVN服务器配置步骤有哪些?-图1
(图片来源网络,侵删)

环境准备

  • 操作系统: CentOS 7 / CentOS 8
  • 管理员权限: 需要使用 root 或具有 sudo 权限的用户。
  • SVN 仓库存放位置: 我们将创建在 /var/svn/ 目录下。

安装 SVN 和 Apache

我们需要安装 Subversion 软件本身以及 Apache Web 服务器,以及让 Apache 支持 SVN 的模块 mod_dav_svn

  1. 更新系统软件包

    sudo yum update -y
  2. 安装 SVN 和 Apache

    • 对于 CentOS 7:
      sudo yum install -y subversion httpd mod_dav_svn
    • 对于 CentOS 8:
      sudo dnf install -y subversion httpd mod_dav_svn

安装完成后,httpd (Apache) 服务和 svnserve (SVN 独立服务) 都已经安装,但我们主要使用 Apache 的方式。

CentOS SVN服务器配置步骤有哪些?-图2
(图片来源网络,侵删)

创建 SVN 仓库

我们创建一个名为 myproject 的示例项目仓库。

  1. 创建仓库根目录

    sudo mkdir -p /var/svn
  2. 创建新仓库 使用 svnadmin 命令创建仓库。

    sudo svnadmin create /var/svn/myproject
  3. 设置仓库目录所有者 为了让 Apache 进程 (apache 用户) 可以读写仓库,需要将仓库目录的所有权更改为 apache 用户。

    CentOS SVN服务器配置步骤有哪些?-图3
    (图片来源网络,侵删)
    sudo chown -R apache:apache /var/svn/myproject

    注意: 如果后续需要通过 svnserve 访问,所有者也需要是 apache,如果通过系统用户(如 svnuser)访问,则所有者应为该用户,本教程统一使用 apache 用户。


配置 Apache 以支持 SVN

我们需要配置 Apache 来处理 SVN 的请求。

  1. 创建 SVN 配置文件 在 Apache 的 conf.d 目录下创建一个新的配置文件。

    sudo vi /etc/httpd/conf.d/svn.conf
  2. 添加以下配置内容 将下面的内容复制并粘贴到 svn.conf 文件中,请根据您的实际情况修改 SVNParentPathAuthUserFile 的路径。

    # 启用 SVN 和 DAV 模块
    LoadModule dav_module modules/mod_dav.so
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so
    # 设置 SVN 仓库的父目录
    # SVNParentPath 指向包含所有仓库的根目录
    <Location /svn>
        DAV svn
        SVNParentPath /var/svn
        # 认证方式:基本认证
        AuthType Basic
        AuthName "SVN Repository for MyProject"
        # 指定密码文件路径
        # 我们将在下一步创建这个文件
        AuthUserFile /etc/svn/passwd
        # 授权策略文件路径
        # 我们将在下一步创建这个文件
        AuthzSVNAccessFile /etc/svn/authz
        # 只有认证成功的用户才能访问
        Require valid-user
    </Location>

    配置说明:

    • <Location /svn>: 定义了 SVN 服务的 URL 前缀,你的仓库将通过 http://your_server_ip/svn/myproject 访问。
    • SVNParentPath /var/svn: 告诉 Apache 所有 SVN 仓库都在 /var/svn 目录下。
    • AuthType Basic: 使用 HTTP 基本认证(用户名/密码)。
    • AuthName: 弹出认证框时显示的提示信息。
    • AuthUserFile: 存储用户名和密码的文件。
    • AuthzSVNAccessFile: 存储用户和用户组权限的文件。
    • Require valid-user: 强制只有 AuthUserFile 中存在的用户才能访问。

创建用户和权限

  1. 创建密码文件并添加用户 使用 htpasswd 命令来创建和管理用户,第一次创建用户时需要使用 -c (create) 选项。

    # 创建第一个用户 'admin'
    sudo htpasswd -c /etc/svn/passwd admin
    # 系统会提示你输入并确认密码
    # 添加第二个用户 'developer'
    sudo htpasswd /etc/svn/passwd developer
    # 添加第三个用户 'guest'
    sudo htpasswd /etc/svn/passwd guest

    注意: -c 选项只在第一次创建文件时使用,后续添加用户不要使用,否则会覆盖已有用户。

  2. 设置权限文件 创建并编辑权限配置文件 /etc/svn/authz

    sudo vi /etc/svn/authz

    authz 文件中,你可以为不同用户和用户组分配对不同仓库或目录的读 (r)、写 (w) 权限。

    示例配置:

    # [仓库路径:用户/用户组]
    # 权限: r (读), w (写), (空) (无)
    # 全局设置
    [/]
    # admin 用户对所有仓库有读写权限
    admin = rw
    # [myproject] 仓库的特定设置
    [:/myproject]
    # admin 用户有读写权
    admin = rw
    # developer 用户有读写权
    developer = rw
    # guest 用户只有读权
    guest = r
    # 可以创建用户组
    [groups]
    # 定义一个名为 'dev_team' 的用户组,包含 developer 和 guest
    dev_team = developer, guest
    # 使用用户组分配权限
    [:/myproject/trunk]
    # dev_team 用户组对 'trunk' 目录有读写权
    @dev_team = rw
    [:/myproject/branches]
    # 只有 developer 对 'branches' 目录有读写权
    developer = rw
    guest = r
    [:/myproject/tags]
    # 所有人都只能读 'tags' 目录
    * = r

    配置说明:

    • [/]: 匹配所有仓库。
    • [:/myproject]: 匹配 myproject 仓库的根目录。
    • [:/myproject/trunk]: 匹配 myproject 仓库下的 trunk 目录。
    • admin = rw: 用户 admin 对该路径有读写权限。
    • @dev_team = rw: 用户组 dev_team 中的所有成员对该路径有读写权限。
    • * = r: 所有认证用户都有读权限。
  3. 设置权限文件的所有者 确保 Apache 进程可以读取这两个配置文件。

    sudo chown apache:apache /etc/svn/passwd /etc/svn/authz
    sudo chmod 640 /etc/svn/passwd /etc/svn/authz

启动并配置防火墙

  1. 启动 Apache 服务

    sudo systemctl start httpd
    sudo systemctl enable httpd # 设置开机自启
  2. 检查 Apache 状态

    sudo systemctl status httpd
  3. 配置防火墙 为了能从外部访问 SVN 服务,需要开放 HTTP (80) 和 HTTPS (443) 端口。

    • 对于 CentOS 7 / 8 (使用 firewalld):
      sudo firewall-cmd --permanent --add-service=http
      sudo firewall-cmd --permanent --add-service=https
      sudo firewall-cmd --reload

测试 SVN 服务器

你可以通过 SVN 客户端(如 TortoiseSVN、命令行 svn 或 IDE 集成工具)来访问你的服务器了。

SVN 仓库地址: http://<你的服务器IP或域名>/svn/myproject

访问步骤:

  1. 在 SVN 客户端中,使用 "Repository Browser" 或 "Checkout" 功能。
  2. 输入仓库地址:http://<你的服务器IP>/svn/myproject
  3. 当弹出认证框时,输入你之前创建的用户名和密码(admin 和其密码)。
  4. 如果一切配置正确,你应该能够看到仓库内容(如 trunk, branches, tags 目录,如果它们存在的话)。

(可选) 配置 HTTPS 加密 (推荐)

在生产环境中,强烈建议使用 HTTPS 来加密数据传输,防止密码和代码被窃听。

  1. 安装 SSL 模块

    # CentOS 7
    sudo yum install -y mod_ssl
    # CentOS 8
    sudo dnf install -y mod_ssl
  2. 获取 SSL 证书 你可以从 Let's Encrypt 免费获取,或者使用自签名证书进行测试。

    • 自签名证书 (仅用于测试):
      sudo openssl genrsa -out /etc/pki/tls/private/svn.key 2048
      sudo openssl req -new -key /etc/pki/tls/private/svn.key -out /etc/pki/tls/certs/svn.csr
      sudo openssl x509 -req -days 365 -in /etc/pki/tls/certs/svn.csr -signkey /etc/pki/tls/private/svn.key -out /etc/pki/tls/certs/svn.crt
  3. 修改 Apache SSL 配置 编辑 /etc/httpd/conf.d/ssl.conf 文件,找到 SSLCertificateFileSSLCertificateKeyFile 并指向你的证书文件。

    SSLCertificateFile /etc/pki/tls/certs/svn.crt
    SSLCertificateKeyFile /etc/pki/tls/private/svn.key
  4. 强制使用 HTTPS (推荐) 编辑你的 /etc/httpd/conf.d/svn.conf 文件,在 <Location /svn> 块的开头添加以下内容,强制所有访问都跳转到 HTTPS。

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </IfModule>
  5. 重启 Apache 服务

    sudo systemctl restart httpd

访问 http://<your_server_ip>/svn/myproject 会自动跳转到 https://<your_server_ip>/svn/myproject,并且是加密连接。


常见问题排查

  • 问题: 403 Forbidden

    • 原因: 通常是权限问题。
    • 解决:
      1. 检查 /var/svn/myproject 目录的所有者是否为 apache (chown -R apache:apache /var/svn)。
      2. 检查 /etc/svn/passwd/etc/svn/authz 文件的所有者和权限是否正确 (chown apache:apache ..., chmod 640 ...)。
      3. 检查 authz 文件中的路径和用户名拼写是否正确。
  • 问题: 405 Method Not Allowed

    • 原因: mod_dav_svn 模块未正确加载或配置。
    • 解决: 检查 /etc/httpd/conf.d/svn.conf 文件,确保 LoadModule 指令存在且正确。
  • 问题: DAV request failed on repository '/svn/myproject': Could not open the requested SVN filesystem

    • 原因: Apache 无法访问仓库文件。
    • 解决: 再次检查仓库目录 (/var/svn/myproject) 和其内部文件(如 db 目录)的所有者是否为 apache
  • 问题: 防火墙阻止访问

    • 原因: 防火墙规则未开放 HTTP/HTTPS 端口。
    • 解决: 运行 sudo firewall-cmd --list-all 检查规则,并确保 httphttps 服务已添加并重新加载。
分享:
扫描分享到社交APP
上一篇
下一篇