開發人員學Linux(8):CentOS7編譯安裝Subversion1.9.5及Apache2.4.25並集成

1.前言

本篇將介紹如何編譯安裝SVN伺服器端管理軟體subverion和Web伺服器Apache。本來在前面的系列文章已經講過使用Nginx作為Web伺服器的,所以我一直在找有關subverion集成nginx的資料,在此過程中找到了Nginx作者Igor Sysoev在回答別人類似問題的網址,網址是mailman.nginx.org/piper,不過按照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 mirrors.hust.edu.cn/apa

httpd-2.4.25:wget mirrors.tuna.tsinghua.edu.cn

serf-1.3.9:wget apache.org/dist/serf/se

scons-2.5.1:wget prdownloads.sourceforge.net

sqlite-amalgamation-3190300:wget sqlite.org/2017/sqlite-

apr-1.5.2:wget mirrors.tuna.tsinghua.edu.cn

apr-util-1.5.4:wget mirrors.tuna.tsinghua.edu.cn

下載完成後的效果如圖所示:

3.編譯安裝

3.1預備

考慮到在編譯過程中需要一些依賴庫支持,通過下面的命令來安裝:

yum install zlib zlib-devel openssl openssl-devel –yn

另外由於serf需要用scons來編譯,而編譯scons又需要python支持,因此需要安裝python:

yum install python –yn

3.2編譯安裝apr

cd /rootntar zxvf /root/apr-1.5.2.tar.gzncd /root/apr-1.5.2/n./configure --prefix=/usr/local/apr-1.5.2nmake && make installn

說明:apr-util依賴於apr,因此優先於apr-util編譯。參數中--prefix=/usr/local/apr-1.5.2表示編譯後的安裝目錄為/usr/local/apr-1.5.2。

3.3編譯安裝apr-util

cd /root/ntar zxvf /root/apr-util-1.5.4.tar.gz ncd /root/apr-util-1.5.4/n./configure --prefix=/usr/local/apr-util-1.5.4 --with-apr=/usr/local/apr-1.5.2nmake && make installn

說明:參數中--prefix=/usr/local/apr-util-1.5.4表示編譯後的安裝目錄為/usr/local/apr-util-1.5.4,同時通過--with-apr=/usr/local/apr-1.5.2參數指定了它的依賴項apr的目錄為/usr/local/apr。

3.4編譯安裝scons

cd /root/ntar zxvf ./scons-2.5.1.tar.gzncd /root/scons-2.5.1/npython setup.py install --prefix=/usr/local/scons-2.5.1n

說明:serf必須使用scons來編譯,因此優先於serf編譯。參數中--prefix=/usr/local/scons-2.5.1表示編譯後的安裝目錄/usr/local/scons-2.5.1。

3.5編譯安裝serf

cd /root/ntar xf ./serf-1.3.9.tar.bz2ncd /root/serf-1.3.9n/usr/local/scons-2.5.1/bin/scons prefix=/usr/local/serf-1.3.9 APR=/usr/local/apr-1.5.2 APU=/usr/local/apr-util-1.5.4n/usr/local/scons-2.5.1/bin/scons installn

說明:參數中- prefix=/usr/local/serf-1.3.9表示編譯後的安裝目錄為/usr/local/serf-1.3.9。

3.6編譯安裝Apache(httpd)

cd /rootntar zxvf /root/httpd-2.4.25.tar.gzncd /root/httpd-2.4.25n./configure n--prefix=/usr/local/httpd-2.4.25 n--enable-dav n--enable-so n--enable-ssl n--enable-cgi n--enable-rewrite n--with-zlib n--with-pcre n--with-apr=/usr/local/apr-1.5.2 n--with-apr-util=/usr/local/apr-util-1.5.4 n--enable-modules=most n--enable-mpms-shared=all n--with-mpm=event n--enable-proxy n--enable-proxy-fcgi n--enable-dav n--enable-dav-fs n--enable-maintainer-moden

編譯及安裝:

make && make installn

說明:因subverion編譯時會將生成的mod_dav_svn.so及mod_authz_svn.so拷貝到/usr/local/httpd-2.4.25/modules目錄,並且在/usr/local/httpd-2.4.25/conf/httpd.conf設置為自動載入。參數中--prefix=/usr/local/httpd-2.4.25表示編譯後的安裝目錄為/usr/local/httpd-2.4.25。

3.7安裝subverion

由於編譯subversion需要sqlite支持,所以將下載的sqlite-amalgamation-3190300.zip解壓後將文件夾重命名為sqlite-amalgamation並拷貝到/root/subversion-1.9.5/目錄下。

cd /rootntar zxvf /root/subversion-1.9.5.tar.gznunzip /root/sqlite-amalgamation-3190300.zipnmv /root/sqlite-amalgamation-3190300 /root/subversion-1.9.5/sqlite-amalgamationncd /root/subversion-1.9.5n./configure n--prefix=/usr/local/subversion-1.9.5 n--with-apr=/usr/local/apr-1.5.2 n--with-apr-util=/usr/local/apr-util-1.5.4 n--with-serf=/usr/local n--enable-mod-activation n--with-apache-libexecdir=/usr/local/httpd-2.4.25/modules n--with-apxs=/usr/local/httpd-2.4.25/bin/apxs n--without-berkeley-dbn

編譯安裝:

make && make installn

支持已經完成了subversion和apache的編譯和安裝,這裡都是通過—prefix參數將編譯後的安裝目錄設置到了/usr/local目錄下。

4.配置

4.1用戶配置

在本實例中subversion的進程和Apache的進程將會以svn來運行,因此需要創建svn用戶賬號。

useradd svn -s /sbin/nologin –mn

4.2環境變數配置

為便於每次運行命令時需要輸入冗長的路徑信息(或切換到其所在目錄),在本處將本系列文章截止到目前的應用程序都添加環境變數中,類似Windows中設置path環境變數,在CentOS7中是在/etc/profile中配置,截止目前在文件末尾添加的內容:

export JAVA_HOME=/usr/local/jdk1.8.0_131nexport JRE_HOME=/usr/local/jdk1.8.0_131nexport CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarnexport PATH=$PATH:$JAVA_HOME/bin:/usr/local/apache-tomcat-8.5.15/bin:/usr/local/httpd-2.4.25/bin:/usr/local/svn/bin:/usr/local/php/binn

即將svn、tomcat、php、Java和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/libn

將文件保存並退出後再通過如下命令查看載入情況:

/sbin/ldconfig –vn

4.3.1創建svn版本庫

mkdir -p /var/svnncd /var/svnnsvnadmin create phpprojectnsvnadmin create javaprojectnsvnadmin create dotnetprojectn

即創建/var/svn目錄,此目錄為svn的根目錄,並在此目錄下依次創建了phpproject、javaproject和dotnetproject三個版本庫。

因為我們最終是要讓subversion支持多個版本庫,因此關於svn賬號、授權的信息不能放在某個單獨的庫下,因此我們直接放在/var/svn這個svn的版本庫根目錄下,主要是三個文件:

authz:用於存放版本庫的授權信息。

passwd:用於存放賬號和密碼。

svnserve.conf:用於svnserve形式啟動的配置文件。

我們從phpproject版本庫中拷貝出這三個文件,然後基於它們修改作為多版本庫的控制文件:

cp /var/svn/phpproject/conf/authz /var/svn/authzncp /var/svn/phpproject/conf/passwd /var/svn/passwdncp /var/svn/phpproject/conf/svnserve.conf /var/svn/svnserve.confn

4.3.2創建svn賬號

為安全起見,將用戶密碼作處理後保存到文件中,這就需要使用Apache自帶的htpasswd工具,它可以生成passwd文件,其中用戶名為明文,用戶密碼為md5哈希值。

htpasswd -c /var/svn/passwd jerry #once onlynhtpasswd /var/svn/passwd harrynhtpasswd /var/svn/passwd rootnhtpasswd /var/svn/passwd adminnhtpasswd /var/svn/passwd haleyn

注意:htpasswd位於/usr/local/httpd-2.4.25/bin,即我們編譯安裝Apache時指定的目錄,因為將/usr/local/httpd-2.4.25/bin添加到/etc/profile中了,所以可以直接htpasswd,如果指定的目錄不存在passwd文件,就需要帶上」-c」參數,表示創建文件,但是之後就不需要了。如果每次都帶上,反而只有最後一次的執行結果。

最終生成的文件內容如下:

4.3.3編輯svnserve.conf文件

可以通過vim /var/svn/svnserve.conf來編輯,最終文件內容如下:

[general]nanon-access = readnauth-access = writenpassword-db = passwdnauthz-db = authzn[sasl]n

4.3.4編輯配置SVN授權文件

執行命令vim /var/svn/authz來編輯,最終文件內容如下:

[aliases]n# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Averagenn[groups]n# harry_and_sally = harry,sallyn# harry_sally_and_joe = harry,sally,&joendevelopers = jerry,haleynadministrators = root,adminnn[/]n@administrators=rwnhaley = rnjerry = rwn* = rnn[javaproject:/]n@administrators = rn@developers = rwnn[phpproject:/]nroot = rwnhaley = rwnjerry = rnn[dotnetproject:/]n@administrators = rwnjerry = rwn

說明:在上面的文件中前面帶」@」的是用戶組,例如dotnetproject這個版本庫administrators組有讀寫許可權,而jerry這個用戶也有讀寫許可權,而其它用戶則沒有許可權。

4.3.5強制開發每次提交代碼必須填寫注釋

默認情況下每次提交代碼時填寫注釋是可選的,但在多人團隊中如果大家每次提交不填寫注釋則容易造成事後不知道提交代碼是為了修復bug還是增加新功能了,因此有必要強制一下,這裡就以要求每次提交時注釋不得少於5個字元為例。

在我們通過svnadmin create版本庫時,每個版本庫下都有個hooks目錄,裡面有不少鉤子的示例。將已創建的任一項目下的hooks子目錄下的pre-commit.tmpl拷貝一份並命名為pre-commit,根據文件名望文生義就知道這個文件是在提交代碼到svn版本庫之前執行的鉤子程序。

現在來編輯pre-commit:

vim /var/svn/pre-commitn

文件的最終結果為如下:

REPOS="$1"nTXN="$2"nn# Make sure that the log message contains some text.nSVNLOOK=/usr/local/svn/bin/svnlookn#$SVNLOOK log -t "$TXN" "$REPOS" | n# grep "[a-zA-Z0-9]" > /dev/null || exit 1nLOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[w一-龥]" | wc -c`nif [ "$LOGMSG" -lt 5 ];nthenn echo -e "Comment cannt be empty! you must input more than 5 chars as comment!" 1>&2n exit 1nfinset -en# Check that the author of this commit has the rights to performn# the commit on the files and directories being modified.n#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1nn# All checks passed, so allow the commit.nexit 0n

然後給pre-commit添加可執行許可權

chmod 755 /var/svn/pre-commitn

然後將pre-commit文件拷貝到其它幾個版本庫的hooks目錄:

cp /var/svn/pre-commit /var/svn/phpproject/hooksncp /var/svn/pre-commit /var/svn/javaproject/hooksncp /var/svn/pre-commit /var/svn/dotnetproject/hooksn

注意:以後每次新建一個版本庫,都要將這個pre-commit拷貝到它的hooks目錄下。

到這裡我們可以通過命令行來啟動svn伺服器了,命令如下:

svnserve --config-file /var/svn/svnserve.conf -d -r /var/svnn

即以/var/svn/svnserve.conf作為配置文件,svn版本庫的根目錄為/var/svn,然後就可以在命令下以svn命令來操作版本庫了。

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.1httpd.conf的修改

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

修改監聽埠,由80修改為8000;

更改apache運行時所使用的user和group,均由daemon修改為svn;

include一個關於svn配置的文件,文件名為httpd-svn.conf,位於/usr/local/httpd-2.4.25/conf/extra/。註:這個文件默認沒有,是稍後將創建的。

同時,為便於按日跟蹤apache日誌,利用了/usr/local/httpd-2.4.25/bin/目錄下的rotatelogs來切割日誌文件,這樣一來ErrorLog和CustomLog的配置就變為:

ErrorLog "|/usr/local/httpd-2.4.25/bin/rotatelogs /usr/local/httpd-2.4.25/logs/error_log.%Y%m%d 86400 480"nCustomLog "|/usr/local/httpd-2.4.25/bin/rotatelogs /usr/local/httpd-2.4.25/logs/access_log.%Y%m%d 86400 480" commonn

上述命令中86400表示以天為單位分割,86400是一天的總秒數,而480表示按照東八時區的時間來分割(與UTC相隔8小時,480分鐘)。

同時,由於編譯時參數的制定,啟用了多個mpm模塊,僅保留一個將其餘的注釋掉,否則啟動時會報錯。修改前後的對比如下圖:

上圖中有紅色框的都是修改後的內容,而下方的就是修改前的內容。

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

首先在/usr/local/httpd-2.4.25/conf/extra/目錄創建前文提到的httpd-svn.conf文件:

vim /usr/local/httpd-2.4.25/conf/extra/httpd-svn.confn

文件內容如下:

<Location /svn>n DAV svnn #support more repositoriesn SVNParentPath /var/svnnn #list all repositoriesn #SVNListParentPath onn AuthType Basicn AuthName "Please input Username and Password"n AuthUserFile /var/svn/passwd n AuthzSVNAccessFile /var/svn/authzn Require valid-usern</Location>n

在這裡使用的是多版本庫的配置,使用了SVNParentPath設置,並且有關用戶賬號、授權信息都是指向svn版本庫的根目錄下的文件。

4.4.3許可權設置

因為設置了Apache以svn/svn這個user/group來運行,因此需要讓svn賬號有讀寫/var/svn目錄下的許可權,可執行命令:

chown –R svn:svn /var/svnn

4.4.4配置Apache為系統Service

我們知道可以在命令行下用/usr/local/httpd-2.4.25/bin/apachectl來啟動、重啟和停止Apache,那麼也可以依此來創建service來讓Apache隨系統一起啟動而不是手動啟動。

可以通過vim /lib/systemd/system/httpd.service來創建httpd.service文件,httpd.service文件內容如下:

[Unit]nDescription=httpd 2.4.25 (Apache)nAfter=syslog.target network.target remote-fs.target nss-lookup.targetnn[Service]nType=forkingn#PIDFile=/usr/local/httpd-2.4.25/httpd.pidnExecStart=/usr/local/httpd-2.4.25/bin/apachectl startnExecRestart=/usr/local/httpd-2.4.25/bin/apachectl restartnExecStop=/usr/local/httpd-2.4.25/bin/apachectl stopnn[Install]nWantedBy=multi-user.targetn

然後就可以通過systemctl enable httpd.service將Apache添加為隨系統啟動的服務了。

5.檢驗配置

tortoisesvn.net/downloa下載與操作系統對應的TortoiseSVN客戶端,就可以checkin和checkout代碼了。

如下圖是checkout時的界面:

下圖是提交時注釋達不到設置要求時的錯誤界面:

下圖是在瀏覽器中打開svn版本庫的界面:

6.總結

從業十幾年來,本人使用過VSS/TFS/StarTeam/SVN/Git作為源代碼版本控工具,目前來說價格比較低廉甚至免費而又實用方便的就是SVN和Git了。本篇就是講述了如何編譯安裝subversion和httpd(即Apache),並使之集成的。


推薦閱讀:

tomcat 與 nginx,apache的區別是什麼?
Web 應用、服務是如何工作的?
Mybatis源碼分析(二)--Sqlsession的執行流程
並發的HTTP請求,apache是如何響應的,以及如何調用php文件的?

TAG:SVNSubversion | CentOS | Apache |