CentOS6.9 apached + svn

【环境】Centos6.4 X86_64 minimum,iptables,selinux已关闭,所需软件包采取yum安装方式

【SVN客户端软件】TortoiseSVN


不得不说的svn客户端的4种访问方式

​ 先说说apache+svn,安装subversion包之后能用客户端访问了,但是不能从网页访问,于是考虑到集成apache和svn,提供更亲和的网页访问方式,但是配置完网页访问后傻眼了,一个简陋的版本库页面,只能浏览和下载不能上传,看来客户端访问还是主流

​ 但是转念一想客户端也有版本库浏览器,同时还能上传下载,那要apache+svn干什么,直到我看到同事误把我写的服务器使用说明文档里的网页访问地址http://serverIP/svn/test粘贴到TortoiseSVN客户端的url里,居然也访问成功了,我才意识到apache+svn和单独的subversion是两种完全不同的访问方式

​ 原来以为apache+svn必须在subversion启动的条件下同时启动apache,并且保持subversion和apache配置完全一致才行,弄明白了之后才发现完全不是这么回事

​ 实际上apache+svn是通过http协议80端口访问版本库,subversion是通过svn协议的3690端口访问版本库,这两种方式互不干涉,可以只启动80,不启动3690,也可以只启3690,不启80,还可以同时启动80和3690,甚至这两种方式的版本库根目录都可以不同的,用户名和密码也可以不同,apache+svn用的是htpasswd的用户名和密码,subversion用的是svnserve.conf指定的passwd文件里的用户名和密码,说白了apache+svn和单独的svn服务是两种完全不同svn服务类型

OK,做个总结:

实际上TortoiseSVN支持总共4种访问方式

  • svn也就是独立的subversion服务,通过3690端口访问

  • http也就是apache+svn,通过80端口访问

  • https也就是apache+svn+ssl,通过443端口访问

  • svn+ssh也就是ssh+svn,这种稍微特殊,借用ssh隧道访问svn版本库,通过22端口访问,本文不涉及这种访问方式,有兴趣的话大家可以自己去查相关资料

​ 【注】windows有个visualsvn好像是直接集成的apache和svn,不知道visualsvn是否有网页上传功能呢。因为一般在linux上部署svn性能更好,安全稳定性更高,所以就没研究windows的svn,大家有兴趣的话可以自己安装个visualsvn试试


配置SVN服务

安装svn

1
yum install subversion

创建版本库

1
2
mkdir -pv /svn/svnrepos	 ##建立版本库路径
svnadmin create /svn/svnrepos ##建立svnrepos svn库

目录 以及文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@svn svnrepos]# tree -L 2
.
├── conf
│   ├── passwd
│   └── svnserve.conf
├── dav
│   └── activities.d
├── db
│   ├── current
│   ├── format
│   ├── fsfs.conf
│   ├── fs-type
│   ├── min-unpacked-rev
│   ├── rep-cache.db
│   ├── revprops
│   ├── revs
│   ├── transactions
│   ├── txn-current
│   ├── txn-current-lock
│   ├── txn-protorevs
│   ├── uuid
│   └── write-lock
├── format
├── hooks
│   ├── post-commit.tmpl
│   ├── post-lock.tmpl
│   ├── post-revprop-change.tmpl
│   ├── post-unlock.tmpl
│   ├── pre-commit.tmpl
│   ├── pre-lock.tmpl
│   ├── pre-revprop-change.tmpl
│   ├── pre-unlock.tmpl
│   └── start-commit.tmpl
├── locks
│   ├── db.lock
│   └── db-logs.lock
└── README.txt
  1. svnserve.conf配置项

    1
    2
    3
    4
    5
    6
    [general]
    anon-access = none #匿名用户无任何权限,如果想匿名用户可读,设置为read即可,默认read
    auth-access = write #认证通过的用户可读可写
    password-db = /svn/svnrepos/etc/passwd #用户名密码文件存放位置
    authz-db = /svn/svnrepos/etc/authz #库权限配置文件存放位置
    realm = Unimation #认证域名,相同认证域名的库的密码缓存可以在多个版本库之间共享

    【注】默认每个库都有一个svnserve.conf, 如果所有库共用一个svnserve.conf,可以在启动svn服务的时候指定添加--config-file=filename, svn服务启动的时候将不会再去读取默认配置文件,而会读取指定svnserve.conf

  2. passwd 配置

    1
    2
    3
    4
    [users]
    harry = harryssecret #定义库的用户和密码,格式为username = passwd
    sally = sallyssecret
    tom = tomssecret
  3. authz配置项

    1
    2
    3
    4
    5
    6
    7
    8
    [groups]                     #定义组和成员
    devteam = harry,sally #格式为groupname = member1,member2

    [svnrepos:/] #定义test1库根目录的访问权限
    * = r #所有用户可读
    @devteam = rw #开发组成员读写,注意组名前面要加@
    [svnrepos:/tomproject] #定义test1下tomproject文件夹的权限
    tom = rw #tom读写
  4. 启停svn服务

    1
    2
    3
    4
    svnserve -d -r /svn/svnrepos
    # -d 以守护进程的方式运行svn服务
    # -r 指定版本库根目录
    # --listen-port 指定监听端口,默认端口3690
  5. 此时即可通过 svn://ip/svn/svnrepos访问

【注】同时运行多个库是和svn服务启动的时候的版本库根目录(-r 参数)有直接关系的,在版本库目录底下建多个库,启动的时候就可以把这些库一并启动起来,登陆时只需要指定不同的库名即可。

删除

删除整库是没有svnadmin remove这种命令, 直接rm -rf删除整个库文件夹即可.


配置apache + svn

准备相关库以及程序包

1
2
yum -y install httpd httpd-devel mod_dav_svn subversion mod_ssl
yum install openssl-devel

apr-1.6.3.tar.gz

1
2
3
4
5
#tar –zvxf apr-1.4.2.tar.gz
#cd apr-1.4.2
#./configure 安装不指定路径时 默认安装到/usr/local/apr
#make
#make install

apr-util-1.6.1.tar.gz

1
2
3
4
#tar –zxvf apr-util-1.3.10.tar.gz
#cd apr-util-1.3.10
#./configure --with-apr=/usr/local/apr
#make && make install

httpd-2.4.33.tar.bz2

1
2
3
4
5
#tar zxvf httpd-2.2.22.tar.gz
#cd httpd-2.2.22
#./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --enable-modules=so --enable-dav --enable-maintainer-mode--enable-rewrite
#make
#make install
1
2
报错:
mod_so can not be built as a shared DSO

使用–enable-modules=all即可,编译安装成功。如:

1
./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr/bin/apr-1-config  --with-apr-util=/usr/local/apr/bin/apu-1-config --enable-modules=so --enable-dav --enable-maintainer-mode--enable-rewrite --enable-modules=all

####apached 依赖库

1
2
3
4
5
6
7
apachectl -t -D DUMP_MODULES|grep svn       #查看apache是否已经加载了dav_svn_module和authz_svn_module

一般yum安装的apache模块都会在启动时自动加载,如果尚未加载,在http.conf文件中添加如下内容后重启httpd服务即可


sed -i '/Options Indexes/s/Indexes/-Indexes/' /etc/httpd/conf/httpd.conf
#其中"-"表示不允许列目录

httpd.conf

1
2
3
4
5
#vim /etc/httpd/conf/httpd.conf
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

此外,鉴于svn需要列出文件夹内容,建议把apache的默认列目录功能关闭,防止svn以外的目录被列出结构,提升安全性

httpd.conf 中 location配置

配置一:

1
2
3
4
5
6
7
8
9
10
#vim /etc/httpd/conf/httpd.conf
<Location /svn>
DAV svn #使用svn模块
SVNParentPath /svn/svnrepos #svn版本库根目录
AuthType Basic #认证类型:基本身份认证
AuthName "SVN" #认证名称
AuthUserFile /svn/svnrepos/etc/.htpasswd #指定用户名密码文件路径
AuthzSVNAccessFile /svn/svnrepos/etc/authz #指定authz文件路径
Require valid-user #有效用户可以访问
</Location>

配置二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##存在异常;
<Location /svn>
DAV svn
SVNParentPath /svn

AuthType Basic
AuthName "UnimationTech"
AuthUserFile /svn/svnrepos/etc/.htpasswd
AuthzSVNAccessFile /svn/svnrepos/etc/authz

# Limit write permission to list of valid users.
#<LimitExcept GET PROPFIND OPTIONS REPORT>
# Require SSL connection for password protection.
# SSLRequireSSL
Require valid-user -- 在其中时 svn 客户端下载将不会进行用户名验证
#</LimitExcept>
</Location>

【注】\和\的区别,\是虚拟目录,用\可以隐藏真实路径,而\是直接使用真实路径

htpasswd密码文件

1
2
3
htpasswd -bc /svn/svnrepos/etc/.htpasswd root 123
htpasswd -b /svn/svnrepos/etc/.htpasswd lg 123
htpasswd -b /svn/svnrepos/etc/.htpasswd scb 123

权限修改

1
2
3
4
chmod 600 /svn/svnrepos/etc/.htpasswd        #修改权限提升安全性
chown -R apache.apache /svn #最后别忘了修改版本库目录权限
service httpd restart #重启服务
chmod -R 700 /svn #权限

authz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[groups]
super_user = root
manage_user = wyh, cgq, lgl
FA = lg, scb
Special = ml, lhjn
Service = hjw, zj


[svnrepos:/]
@super_user = rw
@manage_user = rw
@FA = rw
* = r

[svnrepos:/FA]
@super_user = rw
@manage_user = rw
@FA = rw
* =

[svnrepos:/Market_Department]
@super_user = rw
@manage_user = rw
@Service = rw
* =

[svnrepos:/Services_Department]
@super_user = rw
@manage_user = rw
@Service = rw
* =

[svnrepos:/Shared_Dir]
@super_user = rw
* = r

[svnrepos:/Special_robot]
@super_user = rw
@manage_user = rw
@Special = rw
* =

【参考】

Linux-SVN部署

欣赏此文? 求鼓励,求支持!