Linux下安装subversion1.6.5和apache2
以下安装是在RHEL5.5默认安装的情况下,以root身份进行安装!
这个实验我安装了n次,最后总是不成功,因为涉及到略多的软件和配置。下面是安装步骤和配置,自己记下来。希望给下次配置的时候不要像以前那么费劲了!
1 .下载安装apr,下载地址:http://apr.apache.org/
[root@localhost pub]# tar -jxvf apr-1.3.12.tar.bz2 首先解压缩
[root@localhost pub]# mkdir /usr/local/apr 建立apr要安装到的目录
[root@localhost pub]# cd apr-1.3.12
[root@localhost apr-1.3.12]# ./configure –prefix=/usr/local/apr 开始配置编译
[root@localhost apr-1.3.12]# make;make install 安装
2.安装apr-util
[root@localhost pub]# tar -jxvf apr-util-1.3.9.tar.bz2
[root@localhost pub]# cd apr-util-1.3.9
[root@localhost apr-util-1.3.9]# mkdir /usr/local/apr-util
[root@localhost apr-util-1.3.9]# ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
[root@localhost apr-util-1.3.9]# make;make install
3.安装neon
在安装之前,需要确认libxml2,如果没有安装需要安装上!
[root@localhost pub]# rpm -q libxml2
libxml2-2.6.26-2.1.2.8
[root@localhost pub]# rpm -q libxml2-devel
libxml2-devel-2.6.26-2.1.2.8
[root@localhost pub]# tar -zxvf neon-0.25.5.tar.gz
[root@localhost pub]# mkdir /usr/local/neon
[root@localhost pub]# cd neon-0.25.5
[root@localhost neon-0.25.5]# ./configure –prefix=/usr/local/neon
[root@localhost neon-0.25.5]# make;make install
4.安装Berkeley DB
[root@localhost pub]# cd /usr/local/src
[root@localhost src]# tar -zxvf /var/ftp/pub/db-4.6.18.tar.gz
[root@localhost src]# cd db-4.6.18/
[root@localhost db-4.6.18]# cd build_unix/
[root@localhost build_unix]# mkdir /usr/local/berkeleydb
[root@localhost build_unix]# ../dist/configure –prefix=/usr/local/berkeleydb –enable-cxx
其中-enable-cxx就是编译C++库,这样才能编译Berkeley DB数据库的PHP扩展php_db4.
yum -y install gcc-c++安装一下就可以了
[root@localhost build_unix]# make;make install
[root@localhost build_unix]# echo ‘/usr/local/bekeleydb/lib/’>>/etc/ld.so.conf
[root@localhost build_unix]# ldconfig
这2句的作用就是通知系统Berkeley DB的动态链接库在/usr/local/berkeleydb/lib/目录
5.安装sqlite-amalgamation-3.6.13.tar.gz
[root@localhost pub]# tar -zxvf sqlite-amalgamation-3.6.13.tar.gz
[root@localhost pub]# mkdir /usr/local/sqlite
[root@localhost pub]# cd sqlite-3.6.13/
[root@localhost sqlite-3.6.13]# ./configure –prefix=/usr/local/sqlite
[root@localhost sqlite-3.6.13]# make;make install
6.编译安装httpd, 下载地址:http://httpd.apache.org/
[root@localhost pub]#tar xvzf httpd-2.2.4.tar.gz//解压apache2安装包
[root@localhost pub]#cd httpd-2.2.4//进入解压后的目录
[root@localhost httpd-2.2.4]# mkdir /usr/local/apache2
[root@localhost httpd-2.2.4]# ./configure -prefix=/usr/local/apache2 –enable-dav –enable-so –enable-maintainer-mode –enable-rewrite –with-apr=/usr/local/apr/bin/apr-1-config –with-apr-util=/usr/local/apr/bin/apu-1-config
//配置apache安装,后面的第一个参数是定制apache安装到那个目录,–enable-dav –enable-so是和subversion整合时需要的
[root@localhost httpd-2.2.4]# make;make install 完成安装,如果没有错误,真的太幸运了,哈哈。出现错误是很挠头的!
[root@localhost pub]# cd /usr/local/apache2/
[root@localhost apache2]# bin/apachectl start 启动web服务,并访问,注意防火墙,如果能正确的访问,说明没有问题,ok了!
[root@localhost apache2]# bin/apachectl stop 可以停止,接着安装其他的软件包了。
7安装subversion1.6.5
http://subversion.tigris.org/
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=10339&expandFolder=10339&folderID=260 subversion-1.6.5.tar.gz和subversion-deps-1.6.5.tar.bz2下载地址
[root@localhost pub]# tar -zxvf subversion-1.6.5.tar.gz
[root@localhost pub]# tar -jxvf subversion-deps-1.6.5.tar.bz2
./configure以前,需要yum -y install openssl-devel否则会一直报错,提示你configure的时候加上–with-openssl,即使你加上了也会报错,因为需要一个openssl.h(具体的名字忘了)的头文件,如果你没有安装openssl-devel这个软件包的话,这个.h文件系统中是没有的。再解压缩subversion-devel-1.6.11.tar.gz后,会在解压缩subversion-1.6.11.tar.gz产生的文件夹内生成zlib文件,在configure时,要加上他的路径,否则configure: error: –with-zlib requires an argument.也是报错!
[root@localhost subversion-1.6.5]#./configure –prefix=/usr/local/subversion –with-apxs=/usr/local/apache2/bin/apxs –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –with-neon=/usr/local/neon –with-sqlite=/usr/local/sqlite –with-ssl –with-zlib=/var/ftp/pub/subversion-1.6.5/zlib –enable-maintainer-mode –without-berkeley-db
在make之前一定要执行下一步,否则就会报错如下:
/usr/bin/ld: cannot find -lexpat
collect2: ld returned 1 exit status
make: *** [subversion/svn/svn] Error 1
我也是出现错误了,报错了,然后百度,google一顿狂搜,愣是没有搜到我要的答案,不过大体上知道是缺少一个库文件,这个文件的名称应该包含lib,或expat,因为提示是没有找到lexpat嘛,所以,我就一个软件包一个软件包的测试,才找到这个软件包的,在安装完这个软件包之后,make才继续进行下去的!!!!需要安装的软件包主要是这两个:expat-1.95.8-8.2.1.i386.rpm和expat-devel-1.95.8-8.2.1.i386.rpm
[root@localhost Server]# rpm -ivh expat-1.95.8-8.3.el5_4.2.i386.rpm
warning: expat-1.95.8-8.3.el5_4.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing… ########################################### [100%]
1:expat-devel ########################################### [100%]
[root@localhost Server]# rpm -ivh expat-devel-1.95.8-8.3.el5_4.2.i386.rpm
warning: expat-devel-1.95.8-8.3.el5_4.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing… ########################################### [100%]
1:expat-devel ########################################### [100%]
[root@localhost subversion-1.6.5]#make
[root@localhost subversion-1.6.5]#make install
完成安装。
启动/usr/local/apache2/bin/apachectl start后,如果报错,这个我也查找了N久,才解决报错内容如下:
[root@localhost bin]# ./apachectl start
httpd: Syntax error on line 53 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_dav_svn.so into server: /usr/local/subversion/lib/libsvn_subr-1.so.0: undefined symbol: apr_memcache_add_server
需要在/etc/ld.so.conf中添加一下内容,并执行ldconfig
[root@localhost ~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/apache2/modules/
/usr/local/subversion/bin/
/usr/local/berkeleydb/bin/
[root@localhost ~]#ldconfig
这样在启动apache服务的是否就没有报错了!
安装完成之后,需要配置subversion,在配置之前,首先来了解一下配置语句。
主要配置语句如下:
<Location /svn> 意思是Subversion版本可的URL是http://MyServer IP/svn/
DAV svn 告诉Apache是哪个模块响应哪个URL的请求,在这里是SubVersion模块
SVNPath /path 单版本库时使用此项指明版本库的路径,但是在多版本库中不要使用此项
SVNListParentPath on 对于SubVersion1.3或更高的版本,这个指示会列出所有SVNParentPath中的版本库
SVNParentPath /path 告诉Subversion需要查看的版本库位于/path之下
SVNIndexXSLT “/svnindex.xsl” 使用它可以在用浏览器浏览时更好看
AuthType Basic 激活基本认证,就是用户名和密码
AuthName “Subversion repository” 用来说明何时弹出要求用户输入认证信息的认证对话框
AuthUserFile /path/passwd.conf 指定使用的认证密码文件
AuthzSVNAccessFile /path/authz.conf 位置,Subversion版本库的访问控制文件的路径
Require valid-user 指定只有输入了正确的用户名和密码的用户可以访问URL
</Location>
那么现在首先配置最简单的版本库,那就是单版本库
1)如果只配置一个单版本库,且希望任何人都可以访问你的服务,那么配置语句设置成以下就可以了
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /www> #如果进行访问,在浏览器里输入:http://server IP/www,就可以直接访问了
DAV svn #告诉Apache使用svn模块响应URL的请求
SVNPath /svn/svnroot/www # 这里是版本库所在的路径
</Location>
如果是配置多版本库,而且允许任何人访问你的服务,配置语句如下:
<Location /svn>
DAV svn
SVNLISTParentPath on #此句,最好加上,否则在浏览器中输入http://server IP/sev的时候将看不到,除非用户记下了版本库的名字,哈哈
SVNParentPath /svn/svnroot #注意这里是SVNParentPath了,而不是SVNPath,^_^
</Location>
以上是配置单版本库和多版本库,但是一定要注意一个问题,单版本库和多版本库千万不能同时存在,否则,就会出现问题,最常见的问题如下:
<?xml version=”1.0″ encoding=”utf-8″ ?>
- <D:error xmlns:D=”DAV:” xmlns:m=”http://apache.org/dav/xmlns” xmlns:C=”svn:”>
<C:error />
<m:human-readable errcode=”2″>Could not open the requested SVN filesystem</m:human-readable>
</D:error>
解决的方法就是只保留一个版本库,即,删除或注释掉单个版本库,删除或注释掉多个版本库的配置。如果SVNPath或SVNParentPath后的路径写错了,也会出现这样的错误。
2) 认证访问
对用户的访问进行限制,最简单的限制是通过HTTP的基本认证机制,apache提供了一个htpasswd工具来建立和管理可接受的用户名和密码,使用htpasswd可以建立你希望访问你版本库的用户。
比如:
root@localhost svn]/usr/local/apache2/bin/htpasswd -cm /svn/passwd.conf usera #第一次使用htpasswd时,使用c参数是创建后面的passwd.conf文件,m参数是使用md5进行加密
New password:
Re-type new password:
Adding password for user usera
root@localhost svn]# cat passwd.conf 可以查看新建立用户名与密码的对应问题。
usera:$apr1$jBxj7/..$7QvnzhPVSrn3pXUB6XhPJ.
[root@localhost svn]# /usr/local/apache2/bin/htpasswd -m /svn/passwd.conf userb #在创建完htpasswd.conf后,再添加用户时,可以不使用任何参数。但是如果使用参数c,则会重新创建passwd.conf文件
New password:
Re-type new password:
Adding password for user userb
[root@localhost svn]# cat passwd.conf
usera:$apr1$jBxj7/..$7QvnzhPVSrn3pXUB6XhPJ.
userb:$apr1$AT3ZZ…$jwyfVWT7Hou4/rklZ13Fi.
[root@localhost ~]# awk ‘BEGIN{FS=”:”}{print length($2)}’ /svn/passwd.conf
37
37
我们可以使用awk来查看一下加密后的密码长度,在这里显示是37位。而对于系统用户密码使用md5进行加密后,密码长度为34位,差了3位,仔细观察一下,使用md5加密的密码开始的前三位是$1$,但是在这里$1$之间加了3位,是apr,这是使用htpasswd进行加密的一个不同点。
认证文件添加成功后,需要在httpd.conf的Location区里添加一些指示来告诉Apache如何使用这些密码文件,AuthType指定系统使用的认证类型,使用Basic认证系统即可,AuthName是你提供给认证域一个任意的名称,大多数浏览器会向用户询问用户名和密码的窗口中显示这个名称,最后,使用AuthUserFile指定使用htpasswd城建的密码文件的位置。但是如果只有以上这些还是不够的,即没有指定向那些用户要求输入用户名和密码,最简单的方式是向所有的用户要求用户名和密码,那么添加Require valid-user,就是告诉Apache任何用户都要进行认证。如果是对多个仓库,需要在httd.conf的Location区块中再添加一个控制语句AuthzSVNAccessFile,他后面接权限控制文件,在这里设置为authz.conf,内容,我设置为:
[root@localhost ~]# cat /svn/authz.conf
#[<versionLib>:projectName/directory]
#@<groupsname>=<authorities>
#<username>=<authorities>
#<groupname1>=<username1>,<username2>
[groups]
admin=username,username2
[/]
@admin = rw #指定用户组成员可以读写根目录所有应用
[repos:/abc/aaa]
username1= rw #指定用户username1可以读写:/abc/aaa目录的文件
那么现在,httpd.conf中Location区块的就变成这个样子了(单仓库没有SVNParentPath,SVNListParentPath,AuthzSVNAccessFile,只有SVNPath):
<Location /svn> #/svn这个名字可以随便换,换成/也是可以的,只要自己感觉方便
DAV SVN
SVNListParentPath on
SVNParentPath /svn/svnroot
AuthType Basic
AuthName ”Subversion repository”
AuthUserFile /svn/passwd.conf
Require valid-user
AuthzSVNAccessFile /svn/authz.conf
</location>
3)创建仓库(repository)
创建仓库需要用的svnadmin命令,具体操作如下
[root@localhost ~]# /usr/local/subversion/bin/svnadmin create /svn/svnroot/firstrepo #创建仓库
[root@localhost ~]# ls /svn/svnroot/firstrepo/ #创建完成后,可以查看一下,在firstrepo这个仓库下多了很多文件和目录
conf db format hooks locks README.txt
[root@localhost ~]# /usr/local/subversion/bin/svnadmin create /svn/svnroot/secondrepo #再创建一个,并查看一下
[root@localhost ~]# ls /svn/svnroot/secondrepo/
conf db format hooks locks README.txt
如果是单个仓库,那么,只创建一个仓库就行了。
现在来查看一下刚才创建的两个库,在浏览器地址中输入http://server IP/svn(注意这里为什么要输入svn,是因为httpd.conf中<Location /svn>指定的),输入用户名和密码后,就可以看到刚才创建的两个库了,但是这两个库中没有任何内容。呵呵^_^
其他需要注意事项:
(1)单个版本库的httpd.conf Locatioon区中SVNPath /svn/svnroot/firstrepo跟/usr/local/subversion/bin/svnadmin create /svn/svnroot/firstrepo目录要一样,要不会很挠头的!!多个版本库知道svn的父目录,这里是SVNParentPath /svn/svnroot 就可以了
(2)如果是对多个仓库,需要在httd.conf的Location区块中再添加一个控制语句AuthzSVNAccessFile,他后面接权限控制文件。单个版本库不需要,多个版本库要设置不同版本库的权限
(3)目录svnroot目录的权限设置成755
4)向仓库中导入数据
刚才我们查看了,仓库中没有任何数据,是应为我们没有导入任何数据,现在开始导入数据了,哈哈
首先看一下命令格式:svn import /要导入仓库的路径 file:///svn/svnroot/仓库名 -m “一些说明”
[root@localhost ~]# /usr/local/subversion/bin/svn import /etc file:///svn/svnroot/firstrepo -m “the first repository”
提交后的版本为 1。
#以上命令是将/etc这个目录中的内容导入(import)到第一个仓库中(firstrepo),第一次提交后的还会出现 “提交后的版本为 1。”,每提交一次版本更新一次
[root@localhost ~]# /usr/local/subversion/bin/svn import /home file:///svn/svnroot/secondrepo/-m “Second repository”
#以上命令是将/home目录中的内容(import)到第二个仓库(secondrepo)中。
查看一下刚才导入数据的仓库,在浏览器地址中输入http://server IP/svn(注意这里为什么要输入svn,是因为httpd.conf中<Location /svn>指定的),输入用户名和密码后,就可以看到刚才创建的两个库了,仓库中已经存在我们导入的数据了, 说明导入成功了!^_^!
测试连接
① 启动apache
/usr/local/apache2.2.9/bin/apachectl start
② 打开浏览器,输入http://192.168.1.107/svn/repos #本例服务器ip是192.168.1.107
使用刚才创建的权限用户名与密码登录即可访问
注意:在你上传文件的时候可能会有如下权限不足的提示
Permission denied
svn: Commit failed (details follow):
svn: Can't create directory '/opt/svndata/repos/db/transactions/0-1.txn': Permission denied
这是因为apache在线程用户没有权限访问svn的仓库,两者分别属于不同的用户者
本例apache属于daemon拥有者,而svn仓库属于svn拥有者
解决方法:
chown -R daemon /opt/svndata/repos
chmod -R 755 /opt/svndata/repos
重启下apache:
/usr/local/apache2.2.9/bin/apachectl stop
/usr/local/apache2.2.9/bin/apachectl start
本例是通过Eclipse的svn插件客户端测试的,上传下载完全正常!
*****************************************************************************************
以下部分我没有配置,网上搜索到的,以后也许能用到,先记下来:
版本库服务器的同步
1.单版本库跟服务器目录的同步:
进入到版本库下的hooks下去
svn checkout file:///版本库的目录 /本地要取出的目录
[root@localhost ~]# /usr/local/subversion/bin/svn checkout file:///svn/svnroot/firstrepo//home/export
Cd /data/svn/svnroot/www/hooks
Vi post-commit
#!/bin/sh
SVN=/usr/local/subversion/bin/svn
WEB=/data/www #web目录要更新同步的目录
$SVN update –username apache –passwd 123456 $WEB #这里面的username跟password一定要有读写的权限
Chmod 757 post-commit #给它可执行的权利
2.多版本更服务器目录的同步
进入到版本库下的hooks下去
svn checkout file:///版本库的目录 /本地要取出的目录
Cd /data/svn/svnroot/www/hookd
Vi post-commit
#!/bin/sh
SVN=/usr/local/subversion/bin/svn
$SVN update –username apache –passwd 123456 /home #里面的username跟password一定要有读写的权限
Chmod 757 post-commit #给它可执行的权利
注意:
1.svn checkout file:///版本库的目录 /本地要取出的目录 ——>这步一定要做要不会同步修改的
2.目录位置一定要对应好了,否则出现问题能累死人
希望这篇文章对各位有用,减少各位的麻烦,祝福各位好运