# SVN服务搭建:独立运行和Apache方式运行

作为一名程序员,版本控制工具肯定是接触的非常多的,国内公司一般用的是Git个SVN,我比较常用的是SVN,SVN全程Subversion,是一个自由开源的版本控制系统,SVN有两种运行方式:独立服务器和结合Apache运行,今天就分别就这两种运行方式做一下分析和测试

# 一、独立服务器运行

  1. 安装是在阿里云ECS上进行

    系统:Centos 7  
    IP:47.100.199.117  
    客户端环境分别是阿里云ECS和本地Windows环境;
    
  2. 安装SVN

    # 直接使用yum方式安装
    yum install -y subversion
    # 创建SVN仓库文件夹
    mkdir -p /var/svn/repo
    # 创建仓库
    svnadmin create /var/svn/repo
    
  3. 创建完成之后进入 /var/svn/repo 可以看到如下结构

drwxr-xr-x 2 root root 4096 Aug  7 23:07 conf
drwxr-sr-x 6 root root 4096 Aug  7 23:07 db
-r--r--r-- 1 root root    2 Aug  7 23:07 format
drwxr-xr-x 2 root root 4096 Aug  7 23:07 hooks
drwxr-xr-x 2 root root 4096 Aug  7 23:07 locks
-rw-r--r-- 1 root root  229 Aug  7 23:07 README.txt
  1. 进入 /var/svn/repo/conf 目录,这里是SVN的配置文件,包括用户权限和用户密码

    -rw-r--r-- 1 root root 1080 Aug  7 23:07 authz
    -rw-r--r-- 1 root root  309 Aug  7 23:07 passwd
    -rw-r--r-- 1 root root 3090 Aug  7 23:07 svnserve.conf
    
  2. authz:用户权限的配置文件

    # 这里是别名,和分组功能类似,这里就不演示
    [aliases]
    # 用户分组,比如管理员,开发者,普通员工
    [groups]
    admin = user1,user2
    developer = user3,user4
    employee = user5,user6
    
    # 目录权限,这里配置的repo根目录,目录分级设置不同的权限也是支持的,多配置几个即可
    # 格式 用户 = 权限  r:只读,rw读写; 单个用户直接使用用户名,分组在组名前面加"@"
    [repo:/]
    @admin = rw
    @developer = rw
    @employee = r
    user7 = rw
    user8 = r
    # 这里配置的是admin和developer分组拥有读写权限,employee分组仅拥有读权限,用户7和8同理
    
  3. passwd:用户密码的配置文件

    #这个很简单,就是用户名=密码的格式,密码是明文
    [users]
    user1=user
    user2=user
    user3=user
    ...
    
  4. svnserve.conf:SVN服务进程的配置文件

    # 配置文件默认全部都是注释掉的,我们把前面4个注释打开,修改第一个匿名用户权限为none
    [general]
    anon-access = none      #匿名用户无权访问
    auth-access = write     #认证用户可读写
    password-db = passwd    #指定用户认证密码文件
    authz-db = authz        #指定权限配置文件
    # realm = My First Repository
    # force-username-case = none
    [sasl]
    # use-sasl = true
    # min-encryption = 0
    # max-encryption = 256
    
  5. 启动SVN服务

    # 参数说明: -d 服务后台运行 -r 指定工作目录,只需要指定到根目录,不能指定仓库名;
    svnserve -d -r /var/svn
    

    这种方式运行SVN的访问方式是 svn://ip:3690/仓库名

    SVN服务默认端口号是3690,如果有防火墙的注意开启3690端口; 启动服务后导入一些文件到仓库:

    # -m 参数后面的内容为提交备注
    svn import /etc/httpd/ file:///var/svn/repo/ -m 'test'
    
  6. 执行文件检出:

    svn checkout svn://47.100.199.117/repo/ /home/
    # 首次检出会弹出4次操作
    Authentication realm: <svn://47.100.199.117:3690> ddabc309-1877-4d59-9b7b-0bb23f548926
    # 第一次可以不输入,直接回车
    Password for 'root': 
    Authentication realm: <svn://47.100.199.117:3690> ddabc309-1877-4d59-9b7b-0bb23f548926
    # 第二次输入用户名
    Username: user1
    # 第三次输入密码
    Password for 'user1': 
    -----------------------------------------------------------------------
    ATTENTION!  Your password for authentication realm:
    
       <svn://47.100.199.117:3690> ddabc309-1877-4d59-9b7b-0bb23f548926
    
    can only be stored to disk unencrypted!  You are advised to configure
    your system so that Subversion can store passwords encrypted, if
    possible.  See the documentation for details.
    
    You can avoid future appearances of this warning by setting the value
    of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
    '/root/.subversion/servers'.
    -----------------------------------------------------------------------
    # 是否记住密码,输入yes
    Store password unencrypted (yes/no)? yes
    A    /home/logs
    A    /home/run
    A    /home/conf
    A    /home/conf/httpd.conf
    A    /home/conf/magic
    A    /home/conf.d
    ... ...
    

    检出完毕

# 二、结合Apache运行

  1. 安装SVN同上

    yum install -y subversion
    
  2. 安装Apache和mod_dav_svn

    # SVN和Apache结合使用需要mod_dav_svn模块,用来支持Apache访问SVN;
    yum install -y httpd mod_dav_svn
    
  3. 创建仓库并添加配置文件

    # 创建仓库根目录
    mkdir /var/www/svn
    # 创建仓库
    svnadmin create /var/www/svn/repo
    # 复制出一份默认的权限配置文件,进行配置
    cp /var/www/svn/repo/conf/authz /var/www/svn/
    # 配置用户权限
    vim /var/www/svn/authz
    # 这里的权限和上面的是一样的,为了测试方便就配置两个,一个只读,一个读写,不使用分组
    [aliases]
    [groups]
    [repo:/]
    user9 = rw
    user10 = r
    # 使用Apache服务工具创建用户和密码文件
    # 参数说明: 
    #   -c 创建一个加密文件
    #   -m 默认采用MD5算法对密码进行加密
    #   -b 在命令行中一并输入用户名和密码而不是根据提示输入密码
    htpasswd -cmb /var/www/svn/passwd user9 user9
    添加第二个用户时去掉 -c 参数,否则文件会被替换而不是追加
    htpasswd -mb /var/www/svn/passwd user10 user10
    

    查看/var/www/svn/passwd文件是否添加成功

    user9:$apr1$3mMQAsLC$.AArRpXCm9W0lVST7wa.w1
    user10:$apr1$0JCf1pb6$rHMSLloqdr3u.ripdbb0.1
    
  4. 编辑Apache配置文件增加虚拟路径

    vim /etc/httpd/conf.d/subversion.conf
    
    # 配置如下内容
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so
    #这里的路径是访问SVN的上下文路径
    <Location /svn>
        DAV svn
        # SVN根目录,不带仓库名
        SVNParentPath /var/www/svn
        # 认证类型
        AuthType Basic
        # 登陆时提示内容
        AuthName "subversion login"
        # 用户密码配置文件
        AuthUserFile /var/www/svn/passwd
        # 用户权限配置文件
        AuthzSVNAccessFile /var/www/svn/authz
        # 认证成功的用户可以访问
        Require valid-user
    </Location>
    

    如果服务器配置了多个虚拟主机,那么虚拟主机配置文件如下 默认路径 vim /etc/httpd/conf.d/subversion.conf

    <VirtualHost *:80>
        # 虚拟主机的域名
        ServerName ecs.guitu18.com
        ServerAlias ecs.guitu18.com
    
        LoadModule dav_svn_module modules/mod_dav_svn.so
        LoadModule authz_svn_module modules/mod_authz_svn.so
        # 这里和配置虚拟路径一样
        <Location />
            DAV svn
            SVNParentPath /var/www/svn
            AuthType Basic
            AuthName "subversion login"
            AuthUserFile /var/www/svn/passwd
            AuthzSVNAccessFile /var/www/svn/authz
            Require valid-user
        </Location>
    
    </VirtualHost>
    
  5. 启动服务

    # 对/var/www/svn授权apache完全访问
    chown -R apache:apache /var/www/svn/
    # 启动Apache
    service httpd start
    

    配置完成,Apache方式运行SVN的访问方式是 http://ip/仓库名

  6. 测试同上,这里就不记录了;结束;