您的位置:首页 > 运维架构 > Apache

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

2010-03-23 13:47 561 查看
自己装svn,rpm包没有安装成功,所以源码编译安装。遇到很多困难。网上搜索了很多文章,这篇最好。转下了。

原帖:

http://blog.yening.cn/2006/08/07/165.html

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

Posted in 2006/08/07 ¬ 12:30h.Onion2 Comments »

准备,下载所需要文件.

检查已安装的 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 可以在这里找到 :http://subversion.tigris.org/project_packages.html

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

cd subversion-SVN-LAST-VERSION-DIR
wget http://www.webdav.org/neon/neon-0.25.5.tar.gz 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提供支持的开源数据库 Berkeley DB 进行保存。但是如果加上 –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 http://downloads.sleepycat.com/db-4.3.29.tar.gz
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 中加入

<Location /svn/Lair>

DAV svn
SVNPath /home/svn/Lair
</Location>

可以参考以下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

<VirtualHost _default_:443>
DocumentRoot /var/SVNRoot
ServerName svn.yousite.com:443
ServerAdmin webmaster@yousite.com
<Location />

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

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

</VirtualHost>

更详细的配置说明文档 http://svnbook.red-bean.com/nightly/en/svn.ref.mod_dav_svn.conf.html

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

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

useradd -m svn
创建一个新模块

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

svn import /var/www/Lair http://localhost/svn/Lair -m ‘Initial import’

重新建立工作目录

rm -rf /var/www/Lair (注意备份!!)
svn checkout http://localhost/svn/Lair 测试打开 http://localhost/svn/Lair


如能看到一个你项目录列表,说明您成功了。

* 其它小结

■ 数据转移:

从 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 命令修改一下权限

<m:human-readable errcode=”160029″>

Could not open the requested SVN filesystem
</m:human-readable>

<m:human-readable errcode=”13″>
Could not open the requested SVN filesystem
</m:human-readable>

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

详细的说明文档:http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html

■ 配置文件,使用其支持对文件中的 $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

———————–
Change Log:

2007-06-14 httpd-2.2.4,subversion-1.4.4,BDB-4.3,下通过.neno 还是不能使用0.2.6的,否则根据没有办法 checkout http 协议开头的URL.

2007-01-03 修正关于neno库的安装说明,以上配置可以最新版本的 httpd-2.2.3,subversion-1.4.2,BDB-4.3下通过.

2006-08-14 neon库subversion已经自带,不需要在单独安装,添加-with-ssl即可使用svn对ssl支持.

2006-08-10 补充自动属性的说明.

2006-08-08 加入关于目录访问验证的说明.

2006-08-07 httpd,2.2.3测试依然有效,解决bdb数据库的支持问题,添加从Windows到Linux下的数据转移方案。

2006-07-25 看到到.声仔对 Can’t set position pointer in file 另一种解决方案,我当时也测试了,好像没有成功。不想用apache源代码编译的朋友可以也测试一下

2006-07-09 初稿.

———————–
参考:

http://subversion.tigris.org/faq.html [FAQ]

http://svnbook.red-bean.com/ [文档]

http://www.svnforum.org/ [论坛]

http://d.hatena.ne.jp/cooldaemon/searchdiary?word=%2a%5bSubversion%5d

http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html

http://www.germane-software.com/~ser/R_n_R/subversion.html#ftn.N45

http://zen.sh.nu/book/zh/index.html

Linux
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: