- 准备,下载所需要文件.
- 检查已安装的 Apache2 是否已经安装了 mod_dav .
- 编译SVN,遇到的问题和解决方法
- 使用 默认文件系统(fsfs) 保存数据
- 使用 Berkeley DB 保存数据
- 配置Apache和SVN,测试.
- 其它小结
- 从Windows平台上数据转移
- 配置文件,使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息.
- 基于路径的权限控制
- 常用SVN命令
- 相关资源
准备,下载所需要文件
本文测试环境
1 | Linux MY_SERVER 2.6.9-5.ELsmp #1 SMP Wed Jan 5 19:30:39 EST 2005 i686 i686 i386 GNU/Linux |
Apache 2.2.2
最新的版本 Subversion 可以在这里找到 :http://subversion.tigris.org/project_packages.html
检查已安装的 Apache2 是否已经安装了 mod_dav
如果已经成功安装了Apache,使用 httpd -M 来查看有没有安装 dav_module,如果没有的话 必须附加 ‘–enable-dav’ ‘–enable-dav-fs’ 两个参数重新编译 Apache,否则即使编译通过了svn,apache也会启动不起来.
编译APACHE2.2
- 修改部分源代码
1# vi server/mpm/worker/worker.c
找到下面几行,并改成如下的数值,其目的是在源码中修改apache可支持的 最大线程数和最大客户端数目。
1
2
3
4# define DEFAULT_SERVER_LIMIT 256
# define MAX_SERVER_LIMIT 40000
# define DEFAULT_THREAD_LIMIT 256
# define MAX_THREAD_LIMIT 40000 - 编译配置
优化编译选项及配置apache可加载的模块1
2
3
4
5# CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" \
> ./configure --codefix=/usr/local/apache2.2 --enable-mods-shared=all \
> --enable-so --with-mpm=worker --enable-deflate \
> --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache \
> --enable-proxy --enable-suexec - 编译及安装
1# gmake && make install
- 优化apache配置选项
修改MPM(多道处理器)参数1
2# cd /usr/local/apache2.2
# vi conf/extra/httpd-mpm.conf找到如下选项,并改成对应的数值
1
2
3
4
5
6
7
8ServerLimit 64
ThreadLimit 128
StartServers 8
MaxClients 8192
MinSpareThreads 50
MaxSpareThreads 256
ThreadsPerChild 128
MaxRequestsPerChild 0修改apache2.2子进程所有者
1
2
3
4# vi /usr/local/apache2.2/conf/httpd.conf
把daemon改为nobody
User nobody
Group nobody
编译SVN,遇到的问题和解决方法
使用默认的文件系统保存数据.
最终完整通过安装和测试的编译参数为:
1 2 3 | ./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 |
1 2 | # make # make install |
其中 /home/src/server/ 为 httpd-2.2.2 源代码所在文件夹,根据实际情况调整一下.
- –with-apr 和 –with-apr-util 如果没有加上的话,即使编译成功了也会出现
1Can’t set position pointer in file ‘/home/svn/repos/db/revs/0′: Invalid argument
这样的错误提示.
- 暂时不能使用 Berkeley DB [* 已解决]
svn保存文件更新数据库的方法有两个,一种是直接使用 fs (filesystem)来保存,另一种是通过Oracle提供支持的开源数据库 Berkeley DB 进行保存。但是如果加上 –with-berkeley-db=/usr/local/BerkeleyDB.4.4 就会configure时就会报错.1
2configure: 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好了.
- 在make 的时候可能会遇到缺少 srclib/apr/libapr-1.la,srclib/apr-util/libaprutil-1.la 两个文件,找不到而make error.
解决办法:/usr/local/apache2/lib/ 中找到,将其复制到源代码文件夹相应的位置中.
使用 BerkeleyDB 保存数据
- 安装 BerkeleyDB
1
2
3
4
5
6
7cd /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 - 更新apr和apr-util源代码
1
2
3
4
5
6
7
8# 清理编译后的.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/ ./ - 编译安装
1
2
3
4
5# /configure --with-apxs=/usr/local/apache2/bin/apxs \
> --with-berkeley-db=/usr/local/BerkeleyDB.4.3 \
> --with-ssl
# make
# make install
- BerkeleyDB 版本不能大于 4.3.否则同样会出现以下错误.
1
2configure: 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的版本.
- 必须更新apr,apr-util 源代码.
subversion-1.3.2 自带的 apr-util 的版本是0.9.6的,必须升级为 1.2.7 虽然能编译过去。但在 svn checkout 的时候会提示1
2svn: 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 中自动加上
1 2 | LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so |
两个模块,没有的话,自行加上或检测是否真的编译成功.
假设我们现在要将一个名为 Lair 的项目导入到 SVN中
- Apache的配置
在 conf/httpd.conf 或 conf/extra/httpd-vhosts.conf 中加入1
2
3
4<Location /svn/Lair>
DAV svn
SVNPath /home/svn/Lair
</Location>可以参考以下apache的配置,实现数据加密传输,用户身份验证.
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
32Listen 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 [email protected]
<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
- 配置,并且测试SVN,
创建一个新用户,用了保存仓库.
1useradd -m svn创建一个新模块
1
2# su daemon #(apache是以daemon用户运行的,所以要切换身份,否则可能会报目录访问权限错误)
# svnadmin create --fs-type fsfs /home/svn/Lair导入原来的项目
1svn import /var/www/Lair http://localhost/svn/Lair -m ‘Initial import’重新建立工作目录
1
2# 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 目录下的所有文件可写。
1
2chmod 755 db
chmod 666 db/*否则checkout时出现以下错误,多数是因为 文件或者目录权限问题 引起的,可以尝试用 chown 或者 chmod 命令修改一下权限
1
2
3
4
5
6
7
8<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>另外一种方法没有测试过,原理大致和mysqldump一样,将svn导出为文本文件,然后重新导入,好处是可以避免因为存储格式不同而导致的数据转移困难。
1
2
3
4
5
6
7# 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 时,可以设置不同用户对不同目录的访问控制.以下是一个例子.
1
2
3
4
5
6
7
8
9
10
11
12
13
14[groups]
root = admin.root
web = user1,user2
soft = user3,user4
[/]
@root = rw
[/www]
@web = rw
[/soft]
@soft = rw - 配置文件,使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息(自动属性).
1
2
3
4
5
6
7
8Windows : 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 命令
1
2
3$ svn update
$ svn add “filename”
$ svn commit
详细的说明文档:http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html
参考
- 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
0 Responses to “SVN服务器搭建完全手册”