CentOS7编译安装Subversion1.9.7及Apache2.4.27并集成

1.前言

本篇将介绍如何编译安装SVN服务器端管理软件subverion和Web服务器Apache。本来在前面的系列文章已经讲过使用Nginx作为Web服务器的,所以我一直在找有关subverion集成nginx的资料,在此过程中找到了Nginx作者Igor Sysoev在回答别人类似问题的网址,网址是http://mailman.nginx.org/pipermail/nginx/2007-January/000504.html,不过按照Igor Sysoev的回答并没有成功,因此仍回到Apache与SVN集成,然后再通过Nginx反向代理到Apache的办法。本来直接安装subversion即可实现版本控制,但由于这种方式有一些问题,比如密码是明文保存到文件的,因此采用了Apache集成Nginx的方式。

2.准备

本篇主要讲述编译和配置subversion和Apache(即httpd),但由于编译这两个软件依赖于别的类库,于是总共需要下面7个文件才能完成subverion1.9.5和httpd2.4.25的编译安装,即apr、apr-util、scons、serf、sqlite-amalgamation、httpd和subversion。

我们以root的身份登录系统,将其通过wget下载到/root目录下。

subversion-1.9.5:wget http://mirrors.hust.edu.cn/apache/subversion/subversion-1.9.5.tar.gz

httpd-2.4.25:wget https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.25.tar.gz

serf-1.3.9:wget https://www.apache.org/dist/serf/serf-1.3.9.tar.bz2

scons-2.5.1:wget http://prdownloads.sourceforge.net/scons/scons-2.5.1.tar.gz

sqlite-amalgamation-3190300:wget http://www.sqlite.org/2017/sqlite-amalgamation-3190300.zip

apr-1.5.2:wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.5.2.tar.gz

apr-util-1.5.4:wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.5.4.tar.gz

3.编译安装

3.1预备

考虑到在编译过程中需要一些依赖库支持,通过下面的命令来安装:

yum install zlib zlib-devel openssl openssl-devel –y

另外由于serf需要用scons来编译,而编译scons又需要python支持,因此需要安装python:

yum install python –y

3.2编译安装apr

./configure --prefix=/home/programs/apr

make && make install

说明:apr-util依赖于apr,因此优先于apr-util编译。参数中--prefix=/home/programs/apr表示编译后的安装目录为/home/programs/apr。

3.3编译安装apr-util

./configure --prefix=/home/programs/apr-util --with-apr=/home/programs/apr

make && make install

说明:参数中--prefix=/home/programs/apr-util表示编译后的安装目录为/home/programs/apr-util,同时通过--with-apr=/home/programs/apr参数指定了它的依赖项apr的目录为/home/programs/apr。

3.4编译安装scons

python setup.py install --prefix=/home/programs/scons

说明:serf必须使用scons来编译,因此优先于serf编译。参数中--prefix=/home/programs/apr表示编译后的安装目录为/home/programs/apr。

3.5编译安装serf

cd /root/serf-1.3.9

/home/programs/scons/bin/scons prefix=/home/programs/serf APR=/home/programs/apr APU=/home/programs/apr-util

/home/programs/scons/bin/scons install

说明:参数中- prefix=/home/programs/serf表示编译后的安装目录为/home/programs/serf。

3.6编译安装Apache(httpd)

./configure --prefix=/home/programs/httpd-2.4.27 --enable-dav --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/home/programs/apr --with-apr-util=/home/programs/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-dav --enable-dav-fs --enable-maintainer-mode

make && make install

说明:因subverion编译时会将生成的mod_dav_svn.so及mod_authz_svn.so拷贝到/home/programs/httpd-2.4.27/modules目录,并且在/home/programs/httpd-2.4.27/conf/httpd.conf设置为自动加载。参数中--prefix=/home/programs/httpd-2.4.27表示编译后的安装目录为/home/programs/httpd-2.4.27。

3.7安装subverion

由于编译subversion需要sqlite支持,所以将下载的sqlite-amalgamation-3190300.zip解压后将文件夹重命名为sqlite-amalgamation并拷贝到/home/download/subversion-1.9.7/目录下。

unzip /home/download/sqlite-amalgamation-3190300.zip -d /home/download/subversion-1.9.7/sqlite-amalgamation

cd /home/download/subversion-1.9.7

./configure --prefix=/home/programs/svn --with-apr=/home/programs/apr --with-apr-util=/home/programs/apr-util --with-serf=/home/programs/serf --enable-mod-activation --with-apache-libexecdir=/home/programs/httpd-2.4.27/modules --with-apxs=/home/programs/httpd-2.4.27/bin/apxs --without-berkeley-db

make && make install

支持已经完成了subversion和apache的编译和安装,这里都是通过—prefix参数将编译后的安装目录设置到了/home/programs目录下。

4.配置

4.1用户配置

在本实例中subversion的进程和Apache的进程将会以svn来运行,因此需要创建svn用户账号。

useradd svn -s /sbin/nologin -M

4.2环境变量配置

为便于每次运行命令时需要输入冗长的路径信息(或切换到其所在目录),在本处将本系列文章截止到目前的应用程序都添加环境变量中,类似Windows中设置path环境变量,在CentOS7中是在/etc/profile中配置,截止目前在文件末尾添加的内容:

export PATH=$PATH:/home/programs/httpd-2.4.27/bin:/home/programs/svn/bin

即将svn和Apache的可执行文件的路径都添加到PATH环境变量中,以后执行这些命令时可以直接执行了。

最后,通过source /etc/profile使我们的配置生效。

4.3SVN配置

由于将svn的可执行文件路径添加到/etc/profile中的PATH变量中了,因此可直接执行svn安装目录下的bin子目录中的文件;比如查看版本svn --version。但是第一次执行svn --version命令的时候会报错:

svn: error while loading shared libraries: libserf-1.so.1: cannot open shared object file: No such file or directory

解决办法就是在/etc/ld.so.conf.d/目录下手动创建serf-1.3.9.conf文件,文件内容是libserf-1.so.1文件所在的目录,在本虚拟机中libserf-1.so.1在/usr/local/lib下,因此serf-1.3.9.conf文件内容如下:

/usr/local/lib

将文件保存并退出后再通过如下命令查看加载情况:

/sbin/ldconfig –v

4.3.1创建svn版本库

mkdir -p /home/programs/svn/repo

cd /home/programs/svn/repo

svnadmin create phpproject

svnadmin create javaproject

svnadmin create dotnetproject

即创建/home/programs/svn/repo目录,此目录为svn的根目录,并在此目录下依次创建了phpproject、javaproject和dotnetproject三个版本库。

因为我们最终是要让subversion支持多个版本库,因此关于svn账号、授权的信息不能放在某个单独的库下,因此我们直接放在/home/programs/svn/repo这个svn的版本库根目录下,主要是三个文件:

authz:用于存放版本库的授权信息。

passwd:用于存放账号和密码。

svnserve.conf:用于svnserve形式启动的配置文件。

我们从phpproject版本库中拷贝出这三个文件,然后基于它们修改作为多版本库的控制文件:

cp /home/programs/svn/repo/phpproject/conf/authz /home/programs/svn/repo/conf/authz

cp /home/programs/svn/repo/phpproject/conf/passwd /home/programs/svn/repo/conf/passwd

cp /home/programs/svn/repo/phpproject/conf/svnserve.conf /home/programs/svn/repo/conf/svnserve.conf

4.3.2创建svn账号

为安全起见,将用户密码作处理后保存到文件中,这就需要使用Apache自带的htpasswd工具,它可以生成passwd文件,其中用户名为明文,用户密码为md5哈希值。

htpasswd -c /home/programs/svn/repo/conf/passwd [email protected] #once only

htpasswd /home/programs/svn/repo/conf/passwd xx@lequangroup.com

注意:htpasswd位于/home/programs/httpd-2.4.27/bin,即我们编译安装Apache时指定的目录,因为将/home/programs/httpd-2.4.27/bin添加到/etc/profile中了,所以可以直接htpasswd,如果指定的目录不存在passwd文件,就需要带上”-c”参数,表示创建文件,但是之后就不需要了。如果每次都带上,反而只有最后一次的执行结果。

最终生成的文件内容如下:

CentOS7编译安装Subversion1.9.7及Apache2.4.27并集成

4.3.3编辑svnserve.conf文件

可以通过vim /home/programs/svn/repo/conf/svnserve.conf来编辑,最终文件内容如下:

[general]

anon-access = read

auth-access = write

password-db = passwd

authz-db = authz

[sasl]

4.3.4编辑配置SVN授权文件

执行命令vim /home/programs/svn/repo/conf/authz来编辑,最终文件内容如下:

[aliases]

# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]

# harry_and_sally = harry,sally

# harry_sally_and_joe = harry,sally,&joe

developers = jerry,haley

administrators = root,admin

[/]

@administrators=rw

haley = r

jerry = rw

* = r

[javaproject:/]

@administrators = r

@developers = rw

[phpproject:/]

root = rw

haley = rw

jerry = r

[dotnetproject:/]

@administrators = rw

jerry = rw

说明:在上面的文件中前面带”@”的是用户组,例如dotnetproject这个版本库administrators组有读写权限,而jerry这个用户也有读写权限,而其它用户则没有权限。

4.4subverion与apache集成

直接使用svn协议来操作也是可以的,不过目前比较流行的还是subverion与apache集成,然后借助一个web的svn管理工具,这样svn管理起来就方便很多了。在这一节就将如何讲subverion与apache集成。

因为在当前服务器上已经安装nginx作为web server,并且使用了80端口,所以只好让apache使用8000端口了。这里提一下,网上到处是svn与apache集成的介绍,很少有svn与nginx集成的介绍。我找了一些英文资料,发现在nginx网站上也有人在2007年问过这个问题,而nginx的作者、俄罗斯的Igor Sysoev也回答过这个问题,网址是:http://mailman.nginx.org/pipermail/nginx/2007-January/000504.html,按照作者的说法是可能通过配置支持的,但我没试过,有感兴趣的可以试一下。

4.4.1 httpd.conf的修改

在apache的配置文件httpd.conf需要修改的地方有:

修改监听端口,由80修改为8000;

更改apache运行时所使用的user和group,均由daemon修改为svn;

include一个关于svn配置的文件,文件名为httpd-svn.conf,位于/home/programs/httpd-2.4.27/conf/extra/。注:这个文件默认没有,是稍后将创建的。

同时,为便于按日跟踪apache日志,利用了/home/programs/httpd-2.4.27/bin/目录下的rotatelogs来切割日志文件,这样一来ErrorLog和CustomLog的配置就变为:

ErrorLog "|/home/programs/httpd-2.4.27/bin/rotatelogs /home/programs/httpd-2.4.27/logs/error_log.%Y%m%d 86400 480"

CustomLog "|/home/programs/httpd-2.4.27/bin/rotatelogs /home/programs/httpd-2.4.27/logs/access_log.%Y%m%d 86400 480" common

上述命令中86400表示以天为单位分割,86400是一天的总秒数,而480表示按照东八时区的时间来分割(与UTC相隔8小时,480分钟)。

同时,由于编译时参数的制定,启用了多个mpm模块,仅保留一个将其余的注释掉,否则启动时会报错。修改前后的对比如下图:

CentOS7编译安装Subversion1.9.7及Apache2.4.27并集成

上图中有红色框的都是修改后的内容,而下方的就是修改前的内容。

4.4.2在Apache中增加svn的相关配置

首先在/home/programs/httpd-2.4.27/conf/extra/目录创建前文提到的httpd-svn.conf文件:

vim /home/programs/httpd-2.4.27/conf/extra/httpd-svn.conf

文件内容如下:

<Location /svn>

DAV svn

#support more repositories

SVNParentPath /home/programs/svn/repo

#list all repositories

#SVNListParentPath on

AuthType Basic

AuthName "Please input Username and Password"

AuthUserFile /home/programs/svn/repo/conf/passwd

AuthzSVNAccessFile /home/programs/svn/repo/conf/authz

Require valid-user

</Location>

在这里使用的是多版本库的配置,使用了SVNParentPath设置,并且有关用户账号、授权信息都是指向svn版本库的根目录下的文件。

4.4.3权限设置

因为设置了Apache以svn/svn这个user/group来运行,因此需要让svn账号有读写/home/programs/svn目录下的权限,可执行命令:

chown –R svn:svn /home/programs/svn/repo

chmod –R 777 /home/programs/svn/repo

5.检验配置

在浏览器中输入 http://192.168.1.151:8000/svn/lq

CentOS7编译安装Subversion1.9.7及Apache2.4.27并集成