開發人員學Linux(8):CentOS7編譯安裝Subversion及Apache並集成

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
下載完成後的效果如圖所示:
wKiom1lCs7aAGGEYAAEbG_ib1bU197.png-wh_50 

3.編譯安裝
3.1預備
考慮到在編譯過程當中須要一些依賴庫支持,經過下面的命令來安裝:
yum install zlib zlib-devel openssl openssl-devel –y
另外因爲serf須要用scons來編譯,而編譯scons又須要python支持,所以須要安裝python:
yum install python –y
3.2編譯安裝apr
cd /root
tar zxvf /root/apr-1.5.2.tar.gz
cd /root/apr-1.5.2/
./configure --prefix=/usr/local/apr
make && make install
說明:apr-util依賴於apr,所以優先於apr-util編譯。參數中--prefix=/usr/local/apr表示編譯後的安裝目錄爲/usr/local/apr。
3.3編譯安裝apr-util
cd /root/
tar zxvf /root/apr-util-1.5.4.tar.gz
cd /root/apr-util-1.5.4/
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
說明:參數中--prefix=/usr/local/apr-util表示編譯後的安裝目錄爲/usr/local/apr-util,同時經過--with-apr=/usr/local/apr參數指定了它的依賴項apr的目錄爲/usr/local/apr。
3.4編譯安裝scons
cd /root/
tar zxvf ./scons-2.5.1.tar.gz
cd /root/scons-2.5.1/
python setup.py install --prefix=/usr/local/scons
說明:serf必須使用scons來編譯,所以優先於serf編譯。參數中--prefix=/usr/local/apr表示編譯後的安裝目錄爲/usr/local/apr。
3.5編譯安裝serf
cd /root/
tar xf ./serf-1.3.9.tar.bz2
cd /root/serf-1.3.9
/usr/local/scons/bin/scons prefix=/usr/local/serf APR=/usr/local/apr APU=/usr/local/apr-util
/usr/local/scons/bin/scons install
說明:參數中- prefix=/usr/local/serf表示編譯後的安裝目錄爲/usr/local/serf。
3.6編譯安裝Apache(httpd)
cd /root
tar zxvf /root/httpd-2.4.25.tar.gz
cd /root/httpd-2.4.25
./configure --prefix=/usr/local/httpd-2.4.25  --enable-dav --enable-so  --enable-ssl --enable-cgi  --enable-rewrite  --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/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拷貝到/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 /root
tar zxvf ./subversion-1.9.5.tar.gz
unzip /root/sqlite-amalgamation-3190300.zip
mv /root/sqlite-amalgamation-3190300 /root/subversion-1.9.5/sqlite-amalgamation
cd /root/subversion-1.9.5
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-serf=/usr/local --enable-mod-activation --with-apache-libexecdir=/usr/local/httpd-2.4.25/modules --with-apxs=/usr/local/httpd-2.4.25/bin/apxs  --without-berkeley-db
make && make install
支持已經完成了subversion和apache的編譯和安裝,這裏都是經過—prefix參數將編譯後的安裝目錄設置到了/usr/local目錄下。
4.配置
4.1用戶配置
在本實例中subversion的進程和Apache的進程將會以svn來運行,所以須要建立svn用戶帳號。
useradd svn -s /sbin/nologin –M
4.2環境變量配置
爲便於每次運行命令時須要輸入冗長的路徑信息(或切換到其所在目錄),在本處將本系列文章截止到目前的應用程序都添加環境變量中,相似Windows中設置path環境變量,在CentOS7中是在/etc/profile中配置,截止目前在文件末尾添加的內容:
export JAVA_HOME=/usr/local/jdk1.8.0_131
export JRE_HOME=/usr/local/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export 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/bin
即將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/lib
將文件保存並退出後再經過以下命令查看加載狀況:
/sbin/ldconfig –v
4.3.1建立svn版本庫
mkdir -p /var/svn
cd /var/svn
svnadmin create phpproject
svnadmin create javaproject
svnadmin create dotnetproject
即建立/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/authz
cp /var/svn/phpproject/conf/passwd  /var/svn/passwd
cp /var/svn/phpproject/conf/svnserve.conf  /var/svn/svnserve.conf
4.3.2建立svn帳號
爲安全起見,將用戶密碼做處理後保存到文件中,這就須要使用Apache自帶的htpasswd工具,它能夠生成passwd文件,其中用戶名爲明文,用戶密碼爲md5哈希值。
htpasswd -c /var/svn/passwd jerry #once only
htpasswd /var/svn/passwd harry
htpasswd /var/svn/passwd root
htpasswd /var/svn/passwd admin
htpasswd /var/svn/passwd haley
注意:htpasswd位於/usr/local/httpd-2.4.25/bin,即咱們編譯安裝Apache時指定的目錄,由於將/usr/local/httpd-2.4.25/bin添加到/etc/profile中了,因此能夠直接htpasswd,若是指定的目錄不存在passwd文件,就須要帶上」-c」參數,表示建立文件,可是以後就不須要了。若是每次都帶上,反而只有最後一次的執行結果。
最終生成的文件內容以下:
wKioL1lCs86iOIHWAACWYgof_P0413.png-wh_50 
4.3.3編輯svnserve.conf文件
能夠經過vim /var/svn/svnserve.conf來編輯,最終文件內容以下:
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
[sasl]

4.3.4編輯配置SVN受權文件
執行命令vim /var/svn/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.3.5強制開發每次提交代碼必須填寫註釋
默認狀況下每次提交代碼時填寫註釋是可選的,但在多人團隊中若是你們每次提交不填寫註釋則容易形成過後不知道提交代碼是爲了修復bug仍是增長新功能了,所以有必要強制一下,這裏就以要求每次提交時註釋不得少於5個字符爲例。
在咱們經過svnadmin create版本庫時,每一個版本庫下都有個hooks目錄,裏面有很多鉤子的示例。將已建立的任一項目下的hooks子目錄下的pre-commit.tmpl拷貝一份並命名爲pre-commit,根據文件名望文生義就知道這個文件是在提交代碼到svn版本庫以前執行的鉤子程序。
如今來編輯pre-commit:
vim /var/svn/pre-commit
文件的最終結果爲以下:
REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/local/svn/bin/svnlook
#$SVNLOOK log -t "$TXN" "$REPOS" | \
#   grep "[a-zA-Z0-9]" > /dev/null || exit 1
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[\w\u4e00-\u9fa5]" | wc -c`
if [ "$LOGMSG" -lt 5 ];
then
  echo -e "Comment cann't be empty! you must input more than 5 chars as comment!" 1>&2
  exit 1
fi
set -e
# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit 0
而後給pre-commit添加可執行權限
chmod 755 /var/svn/pre-commit

而後將pre-commit文件拷貝到其它幾個版本庫的hooks目錄:
cp /var/svn/pre-commit /var/svn/phpproject/hooks
cp /var/svn/pre-commit /var/svn/javaproject/hooks
cp /var/svn/pre-commit /var/svn/dotnetproject/hooks
注意:之後每次新建一個版本庫,都要將這個pre-commit拷貝到它的hooks目錄下。
到這裏咱們能夠經過命令行來啓動svn服務器了,命令以下:
svnserve --config-file /var/svn/svnserve.conf -d -r /var/svn
即以/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"
CustomLog "|/usr/local/httpd-2.4.25/bin/rotatelogs /usr/local/httpd-2.4.25/logs/access_log.%Y%m%d 86400 480" common
上述命令中86400表示以天爲單位分割,86400是一天的總秒數,而480表示按照東八時區的時間來分割(與UTC相隔8小時,480分鐘)。
同時,因爲編譯時參數的制定,啓用了多個mpm模塊,僅保留一個將其他的註釋掉,不然啓動時會報錯。修改先後的對好比下圖:
wKioL1lCs-uwxzTHAABqs1aJidk214.png-wh_50 
上圖中有紅色框的都是修改後的內容,而下方的就是修改前的內容。
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.conf
文件內容以下:
<Location /svn>
  DAV svn
  #support more repositories
  SVNParentPath /var/svn

  #list all repositories
  #SVNListParentPath on
  AuthType Basic
  AuthName "Please input Username and Password"
  AuthUserFile /var/svn/passwd
  AuthzSVNAccessFile /var/svn/authz
  Require valid-user
</Location>
在這裏使用的是多版本庫的配置,使用了SVNParentPath設置,而且有關用戶帳號、受權信息都是指向svn版本庫的根目錄下的文件。
4.4.3權限設置
由於設置了Apache以svn/svn這個user/group來運行,所以須要讓svn帳號有讀寫/var/svn目錄下的權限,可執行命令:
chown –R svn:svn /var/svn

5.檢驗配置
在https://tortoisesvn.net/downloads.html下載與操做系統對應的TortoiseSVN客戶端,就能夠checkin和checkout代碼了。
以下圖是checkout時的界面:
wKiom1lCtADijuFDAACJ3bBcjtE475.png-wh_50 
下圖是提交時註釋達不到設置要求時的錯誤界面:
wKioL1lCtBPgRUmQAADDibNf2YE230.png-wh_50 

下圖是在瀏覽器中打開svn版本庫的界面:
 wKioL1lCtCSCmUsJAACmm1EzC6M735.png-wh_50php

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


聲明:本文首發於本人我的微信訂閱號:zhoujinqiaoIT,其後會同時在本人的CSDN、51CTO及oschina三處博客發佈,本人會負責在此四處答疑。java

相關文章
相關標籤/搜索