Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10329036
  • 博文数量: 1669
  • 博客积分: 16831
  • 博客等级: 上将
  • 技术积分: 12594
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 07:23
个人简介

柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!

文章分类

全部博文(1669)

文章存档

2023年(4)

2022年(1)

2021年(10)

2020年(24)

2019年(4)

2018年(19)

2017年(66)

2016年(60)

2015年(49)

2014年(201)

2013年(221)

2012年(638)

2011年(372)

分类: LINUX

2012-10-29 12:35:44

在 Linux/Apache 2.2 上配置SVN服务器  

2012-10-26 16:22:27|  分类: CVS |  标签: |字号 

  • 准备,下载所需要文件.
  • 检查已安装的 Apache2 是否已经安装了 mod_dav .
  • 编译SVN,遇到的问题和解决方法
    • 使用 默认文件系统(fsfs) 保存数据
    • 使用 Berkeley DB 保存数据
  • 配置Apache和SVN,测试.
  • 其它小结
    • 从Windows平台上数据转移
    • 配置文件,使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息.
    • 基于路径的权限控制

    • 常用SVN命令
  • 相关资源

* 准备,下载所需要文件.

本文测试环境:

  • ubuntu 6.06 LTS (kernel 2.6.15-25-k7,gcc-4.0.3) /ubuntu server (2.6.15-26-server,gcc-4.0.4)
    Subversion 1.3.2/1.4.2
    Apache 2.2.2/2.2.3
    GCC 4.1.2

    最新的版本 Subversion 可以在这里找到 :

    * 下载neon库,使svn支持webdav,https加密的链接.(下载并重命名即可,subversion会自动监测并配置),目前只支持 0.25.5.


    cd subversion-SVN-LAST-VERSION-DIR
    wget
    tar xzf neon-0.25.5.tar.gz
    mv neon-0.25.5 neon
    * 检查已安装的 Apache2 是否已经安装了 mod_dav .

    如果已经成功安装了Apache,使用 httpd -M 来查看有没有安装 dav_module,如果没有的话 必须附加 ‘–enable-dav’ ‘–enable-dav-fs’ 两个参数重新编译 Apache,否则即使编译通过了svn,apache也会启动不起来.

    如何编译 Apache 请参考我另外一篇文章.

    * 编译SVN,遇到的问题和解决方法. 使用默认的文件系统保存数据.

    最终完整通过安装和测试的编译参数为:

    ./configure --with-apxs=/usr/local/apache2/bin/apxs \
    --with-apr=/home/src/server/httpd-2.2.2/srclib/apr \
    --with-apr-util=/home/src/server/httpd-2.2.2/srclib/apr-util
    --–with-ssl
    make
    make install

    其中 /home/src/server/ 为 httpd-2.2.2 源代码所在文件夹,根据实际情况调整一下.

    ◆ 遇到问题:

    1) --with-apr 和 --with-apr-util 如果没有加上的话,即使编译成功了也会出现

    Can’t set position pointer in file ‘/home/svn/repos/db/revs/0′: Invalid argument

    这样的错误提示.

    2) 暂时不能使用 Berkeley DB [* 已解决]

    svn保存文件更新数据库的方法有两个,一种是直接使用 fs (filesystem)来保存,另一种是通过Oracle提供支持的开源数据库  进行保存。但是如果加上 –with-berkeley-db=/usr/local/BerkeleyDB.4.4 就会configure时就会报错.

    configure: error: APR-UTIL was installed independently, it won’t be
    possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4

    我想 apr-unit 暂时不支持吧,我们就用默认的fs好了.

    3) 在make 的时候可能会遇到缺少 srclib/apr/libapr-1.la,srclib/apr-util/libaprutil-1.la 两个文件,找不到而make error.

    解决办法:/usr/local/apache2/lib/ 中找到,将其复制到源代码文件夹相应的位置中.

    Update!!

    使用 BerkeleyDB 保存数据.

    1) 安装 BerkeleyDB

    cd /usr/local/src
    wget

    tar xzvf db-4.3.29.tar.gz
    cd /usr/local/src/db-4.3.29/build_unix
    ../dist/configure --enable-compat185
    make
    make install

    2) 更新apr和apr-util源代码

    # 清理编译后的.la文件
    cd /usr/local/src/httpd-2.2.3

    make clean

    cd /usr/local/src/subversion-1.3.2
    rm -rf apr
    rm -rf apr-util
    cp -rf /usr/local/src/httpd-2.2.3/srclib/apr ./
    cp -rf /usr/local/src/httpd-2.2.3/srclib/apr-util/ ./

    3) 编译安装

    ./configure --with-apxs=/usr/local/apache2/bin/apxs \
    --with-berkeley-db=/usr/local/BerkeleyDB.4.3 \
    --with-ssl
    make
    make install

    ◆ 遇到问题:
    1) BerkeleyDB 版本不能大于 4.3.否则同样会出现以下错误.

    configure: error: APR-UTIL was installed independently, it won’t be
    possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4

    主要是apr-util 暂时不支持4.4的版本.

    2) 必须更新apr,apr-util 源代码.
    subversion-1.3.2 自带的 apr-util 的版本是0.9.6的,必须升级为 1.2.7 虽然能编译过去。但在 svn checkout 的时候会提示

    svn: REPORT request failed on ‘/!svn/vcc/default’
    svn: REPORT of ‘/!svn/vcc/default’: Could not read status line: connection was closed by server.

    这个问题困扰了我很长时间,Google和官方论坛都无结果。后来昨天竟然自己无意中解决了,感动的得哭了:)

    * 配置Apache和SVN,测试

    成功编译svn后会在 httpd.conf 中自动加上

    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so

    两个模块,没有的话,自行加上或检测是否真的编译成功.

    假设我们现在要将一个名为 Lair 的项目导入到 SVN中

    1). Apache的配置

    在 conf/httpd.conf 或 conf/extra/httpd-vhosts.conf 中加入

    DAV svn
    SVNPath /home/svn/Lair

    可以参考以下apache的配置,实现数据加密传输,用户身份验证.

    Listen 443

    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl.

    SSLPassPhraseDialog exec:/etc/sendsslpwd
    SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_scache(512000)
    SSLSessionCacheTimeout 300
    SSLMutex file:/usr/local/apache2/logs/ssl_mutex


    DocumentRoot /var/SVNRoot
    ServerName svn.yousite.com:443
    ServerAdmin webmaster@yousite.com

    DAV svn
    SVNPath /var/SVNRoot
    AuthzSVNAccessFile /etc/svnserve.conf
    Satisfy Any
    AuthType Basic
    AuthName “yousite SVN Repository”
    AuthUserFile /etc/httpd-passwords.txt
    Require valid-user


    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /etc/ssl/server.crt
    SSLCertificateKeyFile /etc/ssl/server.key

    更详细的配置说明文档 

    2). 配置,并且测试SVN,

    创建一个新用户,用了保存仓库.

    useradd -m svn

    创建一个新模块

    su daemon (apache是以daemon用户运行的,所以要切换身份,否则可能会报目录访问权限错误)
    svnadmin create --fs-type fsfs /home/svn/Lair

    导入原来的项目

    svn import /var/www/Lair -m ‘Initial import’

    重新建立工作目录

    rm -rf /var/www/Lair (注意备份!!)
    svn checkout

    测试打开
    1152448175.png
    如能看到一个你项目录列表,说明您成功了。

    * 其它小结

    ■ 数据转移:

    从 Windows 平台 SVN 服务器转移
    如果windows svn储存的格式也是dbd的话,直接将SVN的文件夹copy过来即可.然后
    执行 svnadmin recover /var/SVNRoot 检查一下数据库是否损坏.

    最后注意权限,确保 db 目录下的所有文件能被apache读写(留意httpd.conf中的 User 和 Group)。

    chmod 755 db
    chmod 666 db/*

    否则checkout时出现以下错误,多数是因为 文件或者目录权限问题 引起的,可以尝试用 chown 或者 chmod 命令修改一下权限

    Could not open the requested SVN filesystem


    Could not open the requested SVN filesystem

    Can’t open activity db: APR does not understand this error code

    另外一种方法没有测试过,原理大致和mysqldump一样,将svn导出为文本文件,然后重新导入,好处是可以避免因为存储格式不同而导致的数据转移困难。

    # dump data to file (assuming a repo @ c:\repo):

    svnadmin dump c:\repo > c:\repo.txt
    # Copy the file over to linux:
    mkdir /repo
    svnadmin create /repo
    svnadmin load /repo < /repo.txt

    ■ 设置访问控制

    当 httpd.conf 中 设置 AuthzSVNAccessFile 时,可以设置不同用户对不同目录的访问控制.以下是一个例子.

    [groups]
    root = admin.root
    web = user1,user2
    soft = user3,user4

    [/]
    @root = rw

    [/www]

    @web = rw

    [/soft]
    @soft = rw

    一个更复杂的权限控制例子:

    [groups]
    root = user1,user2
    web = user3,user4,user5,user6
    art = user7,user8,user9,user6
    blog = user10,user11


    # 所有的对 根路径 有读写权限而不是具体的某个库,例如 192.168.1.56/svn/ 下 有 trunk,tag,release 三个库,
    则组内成员都对于这三个库具有读写权限.
    [/]
    @root = rw
    @web = rw

    # 指定某个库(trunk)的访问权限
    [trunk:/lib/Lair]
    @blog = rw

    # user5 将对目录有任何权限,虽然他继承根路径
    [trunk:/apps/views/blog]
    @blog = rw
    user5 =

    [trunk:/apps/views/myblog]
    @blog = rw
    user5 =

    [trunk:/www]
    @art = rw
    @blog = rw

    [trunk:/apps/views]
    @art = rw

    详细的说明文档:

    ■ 配置文件,使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息(自动属性).

    Windows : C:\Documents and Settings\%USERNAME%\Application Data\Subversion\config
    Linux : ~\.subversion\config

    [miscellany]

    enable-auto-props = yes
    [auto-props]
    *.php=svn:keywords=Id
    *.html=svn:keywords=Id

    ■ 几条常用svn 命令
    svn update
    svn add “filename”
    svn commit

  • 阅读(808) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~